From e8fcbcbea5d3a6fbaf59bc035b69d4e451ab5ebc Mon Sep 17 00:00:00 2001
From: MCAyd <can.aydin.11676@ozu.edu.tr>
Date: Fri, 24 Mar 2023 16:03:33 +0000
Subject: [PATCH] new structure initialized, post routes are fixed and mostly
 ready

---
 Makefile                                      |   1 -
 blog/__init__.py                              |  21 ---
 blog/config.py                                |  11 --
 blog/main/routes.py                           |   1 -
 blog/models.py                                |  33 ----
 blog/posts.db                                 |   1 -
 blog/posts/forms.py                           |   1 -
 blog/posts/routes.py                          |   1 -
 frontend/application/__init__.py              |   1 +
 frontend/application/frontend/__init__.py     |   1 +
 .../application/frontend/api/PostClient.py    |  14 ++
 .../application/frontend/api/UserClient.py    |   1 +
 frontend/application/frontend/forms.py        |   1 +
 frontend/application/frontend/views.py        |   1 +
 people/__init__.py                            |  31 ----
 people/config.py                              |  12 --
 people/models.py                              |  35 -----
 people/users.db                               |   1 -
 people/users/forms.py                         |   1 -
 people/users/routes.py                        |   1 -
 people/users/utils.py                         |   1 -
 post-service/application/__init__.py          |  25 +++
 .../__pycache__/__init__.cpython-310.pyc      | Bin 0 -> 809 bytes
 .../__pycache__/models.cpython-310.pyc        | Bin 0 -> 1780 bytes
 post-service/application/models.py            |  47 ++++++
 post-service/application/post_api/__init__.py |   7 +
 .../__pycache__/__init__.cpython-310.pyc      | Bin 0 -> 291 bytes
 .../__pycache__/routes.cpython-310.pyc        | Bin 0 -> 3548 bytes
 .../application/post_api/api/UserClient.py    |  15 ++
 .../__pycache__/UserClient.cpython-310.pyc    | Bin 0 -> 687 bytes
 post-service/application/post_api/routes.py   | 147 ++++++++++++++++++
 post-service/instance/posts-service.db        | Bin 0 -> 16384 bytes
 post-service/run.py                           |   9 ++
 user-service/application/__init__.py          |  25 +++
 .../__pycache__/__init__.cpython-310.pyc      | Bin 0 -> 786 bytes
 .../__pycache__/models.cpython-310.pyc        | Bin 0 -> 1678 bytes
 user-service/application/models.py            |  40 +++++
 user-service/application/user_api/__init__.py |   6 +
 .../__pycache__/__init__.cpython-310.pyc      | Bin 0 -> 291 bytes
 .../__pycache__/routes.cpython-310.pyc        | Bin 0 -> 3127 bytes
 user-service/application/user_api/routes.py   | 124 +++++++++++++++
 user-service/instance/users-service.db        | Bin 0 -> 24576 bytes
 user-service/requirements.txt                 |  40 +++++
 user-service/run.py                           |   9 ++
 44 files changed, 513 insertions(+), 152 deletions(-)
 delete mode 100644 Makefile
 delete mode 100644 blog/__init__.py
 delete mode 100644 blog/config.py
 delete mode 100644 blog/main/routes.py
 delete mode 100644 blog/models.py
 delete mode 100644 blog/posts.db
 delete mode 100644 blog/posts/forms.py
 delete mode 100644 blog/posts/routes.py
 create mode 100644 frontend/application/__init__.py
 create mode 100644 frontend/application/frontend/__init__.py
 create mode 100644 frontend/application/frontend/api/PostClient.py
 create mode 100644 frontend/application/frontend/api/UserClient.py
 create mode 100644 frontend/application/frontend/forms.py
 create mode 100644 frontend/application/frontend/views.py
 delete mode 100644 people/__init__.py
 delete mode 100644 people/config.py
 delete mode 100644 people/models.py
 delete mode 100644 people/users.db
 delete mode 100644 people/users/forms.py
 delete mode 100644 people/users/routes.py
 delete mode 100644 people/users/utils.py
 create mode 100644 post-service/application/__init__.py
 create mode 100644 post-service/application/__pycache__/__init__.cpython-310.pyc
 create mode 100644 post-service/application/__pycache__/models.cpython-310.pyc
 create mode 100644 post-service/application/models.py
 create mode 100644 post-service/application/post_api/__init__.py
 create mode 100644 post-service/application/post_api/__pycache__/__init__.cpython-310.pyc
 create mode 100644 post-service/application/post_api/__pycache__/routes.cpython-310.pyc
 create mode 100644 post-service/application/post_api/api/UserClient.py
 create mode 100644 post-service/application/post_api/api/__pycache__/UserClient.cpython-310.pyc
 create mode 100644 post-service/application/post_api/routes.py
 create mode 100644 post-service/instance/posts-service.db
 create mode 100644 post-service/run.py
 create mode 100644 user-service/application/__init__.py
 create mode 100644 user-service/application/__pycache__/__init__.cpython-310.pyc
 create mode 100644 user-service/application/__pycache__/models.cpython-310.pyc
 create mode 100644 user-service/application/models.py
 create mode 100644 user-service/application/user_api/__init__.py
 create mode 100644 user-service/application/user_api/__pycache__/__init__.cpython-310.pyc
 create mode 100644 user-service/application/user_api/__pycache__/routes.cpython-310.pyc
 create mode 100644 user-service/application/user_api/routes.py
 create mode 100644 user-service/instance/users-service.db
 create mode 100644 user-service/requirements.txt
 create mode 100644 user-service/run.py

diff --git a/Makefile b/Makefile
deleted file mode 100644
index 948fba4..0000000
--- a/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-###makefile informations here
diff --git a/blog/__init__.py b/blog/__init__.py
deleted file mode 100644
index eba4b36..0000000
--- a/blog/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from flask import Flask
-from flask_sqlalchemy import SQLAlchemy
-from flask_bcrypt import Bcrypt
-from blog.config import Config
-
-db = SQLAlchemy()
-bcrypt = Bcrypt()
-
-def create_app(config_class=Config):
-    app = Flask(__name__)
-    app.config.from_object(Config)
-
-    db.init_app(app)
-    bcrypt.init_app(app)
-
-    from blog.posts.routes import posts
-    from blog.main.routes import main
-    app.register_blueprint(posts)
-    app.register_blueprint(main)
-
-    return app
diff --git a/blog/config.py b/blog/config.py
deleted file mode 100644
index a094c3c..0000000
--- a/blog/config.py
+++ /dev/null
@@ -1,11 +0,0 @@
-###revise it accordingly.
-import os
-
-class Config:
-    SECRET_KEY = os.environ.get('SECRET_KEY')
-    SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')
-    MAIL_SERVER = 'smtp.googlemail.com'
-    MAIL_PORT = 587
-    MAIL_USE_TLS = True
-    MAIL_USERNAME = os.environ.get('EMAIL_USER')
-    MAIL_PASSWORD = os.environ.get('EMAIL_PASS')
diff --git a/blog/main/routes.py b/blog/main/routes.py
deleted file mode 100644
index 92887f2..0000000
--- a/blog/main/routes.py
+++ /dev/null
@@ -1 +0,0 @@
-###home and categorized discussion routes here
diff --git a/blog/models.py b/blog/models.py
deleted file mode 100644
index 61a8842..0000000
--- a/blog/models.py
+++ /dev/null
@@ -1,33 +0,0 @@
-###write imports here
-
-class Post(db.Model):
-    '''Post table'''
-
-    __tablename__ = 'post'
-    id = db.Column(db.Integer, primary_key=True)
-    title = db.Column(db.String(255), nullable=False)
-    category = db.Column(db.String(10), index=True, nullable=False)
-    date_posted = db.Column(db.DateTime, index=True, nullable=False,
-                            default=datetime.utcnow)
-    content = db.Column(db.Text, nullable=False)
-    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
-    comments = db.relationship('Comment', backref='post', lazy='dynamic')
-
-    def __repr__(self):
-        return '<Post {}>'.format(self.title)
-
-class Comment(db.Model):
-    '''Comment table'''
-
-    __tablename__ = 'comment'
-    id = db.Column(db.Integer, primary_key=True)
-    category = db.Column(db.String(10), nullable=True)
-    date_posted = db.Column(db.DateTime, nullable=False,
-                            default=datetime.utcnow)
-    content = db.Column(db.Text, nullable=False)
-    disabled = db.Column(db.Boolean)
-    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
-    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
-
-    def __repr__(self):
-        return '<Comment {}>'.format(self.id)
diff --git a/blog/posts.db b/blog/posts.db
deleted file mode 100644
index 626d923..0000000
--- a/blog/posts.db
+++ /dev/null
@@ -1 +0,0 @@
-####post.db will be there
diff --git a/blog/posts/forms.py b/blog/posts/forms.py
deleted file mode 100644
index f5af13c..0000000
--- a/blog/posts/forms.py
+++ /dev/null
@@ -1 +0,0 @@
-###write forms here
diff --git a/blog/posts/routes.py b/blog/posts/routes.py
deleted file mode 100644
index 302eef1..0000000
--- a/blog/posts/routes.py
+++ /dev/null
@@ -1 +0,0 @@
-###write routes here
diff --git a/frontend/application/__init__.py b/frontend/application/__init__.py
new file mode 100644
index 0000000..004ea81
--- /dev/null
+++ b/frontend/application/__init__.py
@@ -0,0 +1 @@
+# application/__init__.py
diff --git a/frontend/application/frontend/__init__.py b/frontend/application/frontend/__init__.py
new file mode 100644
index 0000000..ec1eb90
--- /dev/null
+++ b/frontend/application/frontend/__init__.py
@@ -0,0 +1 @@
+# application/frontend/__init__.py
diff --git a/frontend/application/frontend/api/PostClient.py b/frontend/application/frontend/api/PostClient.py
new file mode 100644
index 0000000..3e4b5c9
--- /dev/null
+++ b/frontend/application/frontend/api/PostClient.py
@@ -0,0 +1,14 @@
+# application/frontend/api/PostClient.py
+# from flask import session
+import requests
+
+def get_posts():
+    # headers = {
+    #     'Authorization': 'Basic ' + session['user_api_key']
+    # }
+    url = 'http://172.16.238.130:5002/api/posts'
+    response = requests.request(method="GET", url=url)
+    print(response)
+    return response
+
+get_posts()
\ No newline at end of file
diff --git a/frontend/application/frontend/api/UserClient.py b/frontend/application/frontend/api/UserClient.py
new file mode 100644
index 0000000..c43873a
--- /dev/null
+++ b/frontend/application/frontend/api/UserClient.py
@@ -0,0 +1 @@
+# application/frontend/api/UserClient.py
diff --git a/frontend/application/frontend/forms.py b/frontend/application/frontend/forms.py
new file mode 100644
index 0000000..cc1449a
--- /dev/null
+++ b/frontend/application/frontend/forms.py
@@ -0,0 +1 @@
+# application/frontend/forms.py
diff --git a/frontend/application/frontend/views.py b/frontend/application/frontend/views.py
new file mode 100644
index 0000000..20207dc
--- /dev/null
+++ b/frontend/application/frontend/views.py
@@ -0,0 +1 @@
+# application/frontend/views.py
diff --git a/people/__init__.py b/people/__init__.py
deleted file mode 100644
index 7593f7f..0000000
--- a/people/__init__.py
+++ /dev/null
@@ -1,31 +0,0 @@
-###initialize def create_app here, users specifically
-
-from flask import Flask
-from flask_sqlalchemy import SQLAlchemy
-from flask_bcrypt import Bcrypt
-from flask_login import LoginManager
-from flask_mail import Mail
-from people.config import Config
-
-
-db = SQLAlchemy()
-bcrypt = Bcrypt()
-login_manager = LoginManager()
-login_manager.login_view = 'users.login'
-login_manager.login_message_category = 'info'
-mail = Mail()
-
-
-def create_app(config_class=Config):
-    app = Flask(__name__)
-    app.config.from_object(Config)
-
-    db.init_app(app)
-    bcrypt.init_app(app)
-    login_manager.init_app(app)
-    mail.init_app(app)
-
-    from flaskblog.users.routes import users
-    app.register_blueprint(users)
-    
-    return app
diff --git a/people/config.py b/people/config.py
deleted file mode 100644
index b67070c..0000000
--- a/people/config.py
+++ /dev/null
@@ -1,12 +0,0 @@
-####initialize class config here, users specifically.
-
-import os
-
-class Config:
-    SECRET_KEY = os.environ.get('SECRET_KEY')
-    SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')
-    MAIL_SERVER = 'smtp.googlemail.com'
-    MAIL_PORT = 587
-    MAIL_USE_TLS = True
-    MAIL_USERNAME = os.environ.get('EMAIL_USER')
-    MAIL_PASSWORD = os.environ.get('EMAIL_PASS')
diff --git a/people/models.py b/people/models.py
deleted file mode 100644
index 02fa1be..0000000
--- a/people/models.py
+++ /dev/null
@@ -1,35 +0,0 @@
-###write User class and def load_user here
-
-###write imports
-
-@login_manager.user_loader
-def load_user(user_id):
-    return User.query.get(int(user_id))
-    
-class User(db.Model, UserMixin):
-    id = db.Column(db.Integer, primary_key=True)
-    firstname = db.Column(db.String(30), unique=True, nullable=False)
-    lastname = db.Column(db.String(20), unique=True, nullable=False)
-    phonenumber = db.Column(db.String(20), unique=True, nullable=False)
-    email = db.Column(db.String(120), unique=True, nullable=False)
-    role = db.Column(db.String(10), unique=False, nullable=False)
-    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
-    password = db.Column(db.String(60), nullable=False)
-    posts = db.relationship('Post', backref='author', lazy=True)
-    comments = db.relationship('Comment', backref='author', lazy='dynamic')
-
-    def get_reset_token(self, expires_sec=1800):
-        s = Serializer(current_app.config['SECRET_KEY'], expires_sec)
-        return s.dumps({'user_id': self.id}).decode('utf-8')
-
-    @staticmethod
-    def verify_reset_token(token):
-        s = Serializer(current_app.config['SECRET_KEY'])
-        try:
-            user_id = s.loads(token)['user_id']
-        except:
-            return None
-        return User.query.get(user_id)
-
-    def __repr__(self):
-        return f"User('{self.username}', '{self.email}', '{self.image_file}')"
diff --git a/people/users.db b/people/users.db
deleted file mode 100644
index 2409fb1..0000000
--- a/people/users.db
+++ /dev/null
@@ -1 +0,0 @@
-###users.db will be there
diff --git a/people/users/forms.py b/people/users/forms.py
deleted file mode 100644
index f5af13c..0000000
--- a/people/users/forms.py
+++ /dev/null
@@ -1 +0,0 @@
-###write forms here
diff --git a/people/users/routes.py b/people/users/routes.py
deleted file mode 100644
index 2599627..0000000
--- a/people/users/routes.py
+++ /dev/null
@@ -1 +0,0 @@
-###write user routes here
diff --git a/people/users/utils.py b/people/users/utils.py
deleted file mode 100644
index 0a22db6..0000000
--- a/people/users/utils.py
+++ /dev/null
@@ -1 +0,0 @@
-###write utils here
diff --git a/post-service/application/__init__.py b/post-service/application/__init__.py
new file mode 100644
index 0000000..b1ef545
--- /dev/null
+++ b/post-service/application/__init__.py
@@ -0,0 +1,25 @@
+# application/__init__.py
+from flask import Flask
+from flask_login import LoginManager
+from flask_sqlalchemy import SQLAlchemy
+
+db = SQLAlchemy()
+login_manager = LoginManager()
+
+
+def create_app():
+    app = Flask(__name__)
+    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///posts-service.db'
+
+    db.init_app(app)
+    login_manager.init_app(app)
+
+    with app.app_context():
+        # Register blueprints
+        from .post_api import post_api_blueprint
+        app.register_blueprint(post_api_blueprint)
+         
+        from .models import Post,Comment
+        db.create_all()
+
+        return app
\ No newline at end of file
diff --git a/post-service/application/__pycache__/__init__.cpython-310.pyc b/post-service/application/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0c17d74df78e80ce685328737f59d3dbe2a98ae9
GIT binary patch
literal 809
zcmYjPOK%e~5VpOKZ1bq9N>B-LLE@4FU2%n~YG{i<N-H2B)Nru2yKcIzy}Q^Br6@V2
zcm6_i<S+Tkss8{tF|$#W+M3b$^LQSgr|fi^1lHc)$JrM~$ZtH{Ux1N45VHd+BN>%M
z(IKU1Gs%=U^lICaz6yo`B_f!SVJJM%jm*!28#0Wta6r0^JBUEK)CI3)VlKgG_sdaU
z93@3E5*p6U!TWwsrsqOkr|7#}J{S?mK8U#iWr?LTI)!Q`<bq{vhgk2{pO87!WrL+P
zA-Cb2{CooSd6_R8Dw@JQplcI~o`43jsajK}+EeHPVsz#NJw6i#{rRwGfDg!XVqRXs
z3*09l8DQP;_{SsjRpwT_h~u~_jWy4V(BJY@Y-gu#3!CZhzd1ZQ;Rn5sy;r@#A^-H@
z?Hz>%pxI4)!ILWIr*bSRofo#toc|6`*Vr$W5&*1g<ljY{7l{&_yD%+_vwY+jWQg)2
z#|V|{NF<W01(U7?7zalyzFQY9^XLYK+SFo{8!PlGtqWC|328KPtk=-1nQD<(!4oOF
zzVjen{d(o`i|7a7_-{8pFO`VL(0F_x%%v@>IK4WBdTK_Ngv1a*=4oQ{vWPja3+LO_
z^(s+S;T)QWpd#9&O@`72y}=^N*wa6H3$Bj4Yc4p$@mUbls%>7kuRU;Z8w&(JCRt39
l#_7>*RO_fPOkMjug;`y+12l}K*u@Vr_@GU3hb*LR?>~%!%F+M;

literal 0
HcmV?d00001

diff --git a/post-service/application/__pycache__/models.cpython-310.pyc b/post-service/application/__pycache__/models.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1f1af8bfe2ed3567c5f6da2936219a144df51897
GIT binary patch
literal 1780
zcmaJ>OK;mo5Z>imGG)oCV)v1>?juE2Al4r+f}jpu6h(~y@rf6L)~prEe5gaJiG<#q
zYi>RE5Fh<d`WqI#_2i$>^w7?%XeEH1lGx$w%<l4=-S6A7(`gHOp8RnS{&a=-i#zW=
z4s{+;tJr`5nTcFRQVOuZ&aB*uEGfPh;DGy5fUD%xKDQ%>A|Ch@@tcSX!Ba78T}fJI
zD76JASLCr9KvJtZ&DEF#?>>ZQ_3z)vQ6iEcB1_p*hnfo#tXEd#Df_kQU&zQ`<z5G1
zUr0to`PMq-QH-PhD?4g8t8A!n+JS(^Z8ni^Gp|SeEoea-HXx)KedxgEOA&nlUFgww
z09#Z~Upr6Asy@DydSixZp5P)rQ;VyA3Gg8WgJPa#$w{WJ1{4`u+D!{kFOc_~(mtru
zWS-U9KPdBD6}5I|v>e43MUtmun&6)#<1<vJ+R2jTV$9oj{jkr+b3m=)^+EnBrlMwR
zoy#4uEeN7@v~2A&$ld$+aA<3{PU}o*yQ)!JDG&;$QrYRHz>jE&H~XV!Wv)i^O5y0S
zs?O?iHX1)a$;!!yp*^7ZFX>o~lG!Xv$4Q-*#V9X9W!2tnp@TR^HN!aGWK0&Bfn0X@
z?|avo8zuNO%9QXaIa~lWQv!W$Y7R9z?cY69%%z9hG*0`BFiruva2*g5H7RkS+svjo
z0Z^d*aaq)~t9X~j;0_zEab-T{d465S)2b}Cs8ca!$8w~3>FfQy3=Q;V(9!S?7f2_g
z;#jxinChNq?1ypu^E}B`8RW9HcTi^YywLs+1Yx4kpvHS9^|Z#cm>A^9MeE=(fj%Y)
zAfKo9=JmKJpW|oTagNoC8h6<ZQDtVwt7qwqYF=@s!cQoPpR;*ep7FRwWEF8U6bVF6
zhH@acWncE_4Xn^MBW{S#qbZMg+LFxs#b?Cmt6<s!n`E>WRwJXZk!OeGNfKL2wR`Q;
zw+AH63oF_J9|DqApJivHwn0Z8VwV6MBjdpinL})mUHVMNy%cWnX)Ospb&$2;(>dK1
zJHq&HrC}c}!~I5itd2MG!O+G#G)<e;nO;n`+o)qU{XQiP%kRo%uUY8*MCS?&(fL@2
z)HjGuBzIRNcUS-2<DWBU%=sHW;E21oaM=*x8%kConKh54_s_C>4Q);20e->De97i3
zHq2S%a`0<5rfOcy5E6&%F&pt)HoIiB|6N&TDk<pxPAk6RV8!nCVTmf86hEp38vOsy
zPCi_&u<Daxb}}zR!%@Rc&L0gu-9R+@aDU<p$I#Z0<2KssV1FgghkQ*|0U2JkZ*710
EA6W%@lK=n!

literal 0
HcmV?d00001

diff --git a/post-service/application/models.py b/post-service/application/models.py
new file mode 100644
index 0000000..bb46f06
--- /dev/null
+++ b/post-service/application/models.py
@@ -0,0 +1,47 @@
+# application/models.py
+from . import db
+from datetime import datetime
+
+class Post(db.Model):
+    id = db.Column(db.Integer, primary_key=True)
+    user_id = db.Column(db.Integer)
+    title = db.Column(db.String(255), nullable=False)
+    category = db.Column(db.String(20), index=True, nullable=False)
+    date_added = db.Column(db.DateTime, default=datetime.utcnow)
+    content = db.Column(db.Text, nullable=False)
+    comments = db.relationship('Comment', backref='post', lazy='dynamic')
+
+    def __repr__(self):
+        return '<Post %r>' % (self.title + str(self.id))
+
+    def to_json(self):
+        return {
+        'id': self.id,
+        'user_id': self.user_id,
+        'title': self.title,
+        'category': self.category,
+        # 'comments': [c.serialize for c in self.comments],
+        'date_added': self.date_added,
+        'content' : self.content
+    }
+
+
+class Comment(db.Model):
+    id = db.Column(db.Integer, primary_key=True)
+    date_added = db.Column(db.DateTime, default=datetime.utcnow)
+    content = db.Column(db.Text, nullable=False)
+    disabled = db.Column(db.Boolean)
+    user_id = db.Column(db.Integer)
+    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
+
+    def __repr__(self):
+        return '<Comment %r>' % (str(self.post_id) + '-' + str(self.id))
+
+    def to_json(self):
+        return {
+        'id': self.id,
+        'post_id': self.post_id,
+        'user_id': self.user_id,
+        'content': self.content,
+        'date_added': self.date_added
+    }
diff --git a/post-service/application/post_api/__init__.py b/post-service/application/post_api/__init__.py
new file mode 100644
index 0000000..3b20470
--- /dev/null
+++ b/post-service/application/post_api/__init__.py
@@ -0,0 +1,7 @@
+# application/post_api/__init__.py
+from flask import Blueprint
+
+post_api_blueprint = Blueprint('post_api', __name__)
+
+from . import routes
+
diff --git a/post-service/application/post_api/__pycache__/__init__.cpython-310.pyc b/post-service/application/post_api/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b48bf2eb3ed3c7236a56b9d001db170624f06a74
GIT binary patch
literal 291
zcmYjLu}TCn5KXd|Wj#C)YinT(%@2r(2zEAh+l1U^)NsirBw58)TMK`~UrK9rzhLF$
zMDfAAVdl*|o?oq&1o8fIq~EZA*5N-I94@fZF_I>lTH@$HDFLb(uva!Ty3q@}aD3pD
zXnsrjc8j;9r)BTb&Jd!Ra_NFkS*l>R^hax>pEIPJzAgODs<ep=h0;kmDF;%P!`~0N
z{&OLb<Ix9+HS~_YuEm3QAm#*7TtV7oAH?{yw*FpJgA?38nh}Hw!J1KJ<ENcavj{28
aWU`c};kk5Y&g<F2c@3Caq<y+%2kaZw7EW>i

literal 0
HcmV?d00001

diff --git a/post-service/application/post_api/__pycache__/routes.cpython-310.pyc b/post-service/application/post_api/__pycache__/routes.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..926fda46fede6ebacaca0384a9c5afc961ce8711
GIT binary patch
literal 3548
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
NnzGJ~ly_F!{J)&O4#5Bb

literal 0
HcmV?d00001

diff --git a/post-service/application/post_api/api/UserClient.py b/post-service/application/post_api/api/UserClient.py
new file mode 100644
index 0000000..b76ec79
--- /dev/null
+++ b/post-service/application/post_api/api/UserClient.py
@@ -0,0 +1,15 @@
+# application/post_api/api/UserClient.py
+import requests
+
+
+class UserClient:
+    @staticmethod
+    def get_user(api_key):
+        headers = {
+            'Authorization': api_key
+        }
+        response = requests.request(method="GET", url='http://cuser-service:5001/api/user', headers=headers)
+        if response.status_code == 401:
+            return False
+        user = response.json()
+        return 
\ No newline at end of file
diff --git a/post-service/application/post_api/api/__pycache__/UserClient.cpython-310.pyc b/post-service/application/post_api/api/__pycache__/UserClient.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..42088105536f32153aa0e8406b918ddd94b944e3
GIT binary patch
literal 687
zcmYjPv2GMG5FOilx2q)=0%;JUqPqe%Akjn!fdZuBnm}`nwd`2Az1v%FY%eIMyDDiZ
zDCwZ&m)uhE3p6m^<id_LBYS4v%$u?GXp{m;+C0E-4B%I|^hMC+C8@nn1_4<GQ#c0X
zC@ulT1)nlxCoqnFQyeBmuzk6~-y^RA%7!Ud0vYm4xM0%=ML_%XgH`6JDpl<Y;&CGp
zod%>wr1mKpWNRqdhB=s14HRpJ(HF7dYd+^VSa7qC!xLEZ@8Sn+1Oio$Cw}y*bu(?s
zRqje%dvW~c{p#V&x#lp-ik4bGBK=er>hRgY!ILa+$}D)t!Vi~<kmyBgDj&~Oj>_2b
zD{*{Fv=gJwT4kN}@%72yvMzV6m4!y-qq)^J<;7G{F4Vb+X@r2Xjjk=lLzkamZj<}Z
zyKJVHs%xCRR(9cZlNFyoR{At+v~^pG#IC8zqMM`($Uryf{~bPV&V6#KoDB7cVRyS^
zA`$)F6Df;WLb}@T<!^H*<AG14tn;Ok(x*}`HMUha??`#p=GAp%CrnuuSIaSXsCYL+
t&+G*sClj8}1`Y{uw#z!-n44r9?_t6kOaS`i`Bmc=;WOCq3ler$`~#6YtgHY4

literal 0
HcmV?d00001

diff --git a/post-service/application/post_api/routes.py b/post-service/application/post_api/routes.py
new file mode 100644
index 0000000..11ef2e3
--- /dev/null
+++ b/post-service/application/post_api/routes.py
@@ -0,0 +1,147 @@
+# application/post_api/routes.py
+from flask import jsonify, request, make_response
+from . import post_api_blueprint
+from .. import db
+from ..models import Post, Comment
+from .api.UserClient import UserClient
+import sqlite3
+
+# 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 = []
+    for row in Post.query.all():
+        data.append(row.to_json())
+
+    response = jsonify(data)
+    return response
+
+@post_api_blueprint.route('/api/<int:post_id>', methods=['GET'])
+def get_post(post_id):
+    responses = []
+
+    post = Post.query.get_or_404(post_id)
+    responses.append(post.to_json())
+
+    for row in Comment.query.filter(Comment.post_id == post_id).all():
+        responses.append(row.to_json())
+
+    response = jsonify(responses)
+
+    return response
+
+@post_api_blueprint.route('/api/comments', methods=['GET'])
+def get_comments():
+    data = []
+    for row in Comment.query.all():
+        data.append(row.to_json())
+
+    response = jsonify(data)
+    return response
+
+@post_api_blueprint.route('/api/<int:post_id>/<int:comment_id>', methods=['GET'])
+def get_comment(post_id,comment_id):
+    comment_response = []
+
+    comment = Comment.query.filter(Comment.post_id == post_id,
+        Comment.id == comment_id).first()
+
+    comment_response.append(comment.to_json())
+
+    if comment_response == []:
+        abort(404)
+
+    response = jsonify(comment_response)
+
+    return response
+
+@post_api_blueprint.route('/api/new-post', methods=['POST'])
+def post_newpost():
+    api_key = request.headers.get('Authorization')
+    response = UserClient.get_user(api_key)
+
+    user = response['result']
+    u_id = int(user['id'])
+
+    title = request.form['title']
+    category = request.form['category']
+    content = request.form['content']
+
+    post = Post()
+    post.user_id = u_id
+    post.title = title
+    post.category = category
+    post.content = content
+
+    db.session.add(post)
+    db.session.commit()
+
+    response = jsonify({'message': 'Post added', 'result': post.to_json()})
+
+    return response
+
+@post_api_blueprint.route('/api/<int:post_id>/delete', methods=['GET','POST'])
+# @login_required
+def delete_post(post_id): 
+    current_user_id = 1
+    post = Post.query.get_or_404(post_id)
+
+    if post.user_id != current_user_id:
+        abort(403)
+    db.session.delete(post)
+    db.session.commit()
+
+    response = jsonify({'message': 'Post deleted'})
+
+    return response
+
+# @post_api_blueprint.route('/api/<post>/new-comment', methods=['POST'])
+
+@post_api_blueprint.route('/api/<int:post_id>/<int:comment_id>/delete', methods=['GET','POST'])
+# @login_required
+def delete_comment(post_id,comment_id): 
+    current_user_id = 2
+ 
+    comment = Comment.query.filter(Comment.post_id == post_id,
+        Comment.id == comment_id).first()
+
+    if comment.user_id != current_user_id:
+        abort(403)
+    db.session.delete(comment)
+    db.session.commit()
+
+    response = jsonify({'message': 'Comment deleted'})
+
+    return response
diff --git a/post-service/instance/posts-service.db b/post-service/instance/posts-service.db
new file mode 100644
index 0000000000000000000000000000000000000000..674332029ee9309152899854474e0910226099a7
GIT binary patch
literal 16384
zcmeI(Jx|*}7zgmP6OkqraTkOT1GiL7B#0c_Ng#r@1`e7wIMlc)Oel@rVkwEM*a#RA
zo%ksI7~T2-I`;#xckW$Y3ZW={W1;$AVx4_??(Vstr}$;(Wz~;7`Znmc8xhsX10qS}
zDW!yvIljgDHY_o|bM;sn{xGJVBe~blCwV|@@+(murN8hB1p*L&00bZa0SG_<0uX=z
z1a4p8G>j#tXJ@6em8kKi<u!wL+v`MwD!yhj(_z#xSF4N;8fhk#^j%u99Ja}9YSkQS
zy{cB{X)5V9B5%Lpx}Hndc|WJJ#YA&6=tO)_>ablNdo|t<#iTA>t<|c`v_$Y>=ymrm
z#}`fSgD|?*v~5?mOnZ;MV0$#<yIB#oQL|ZP(-Li&L6<DG*#@(jwZ?X+XzK;1vfJ{+
z^um<X_B*b3>>uy<!kaw%cR}|=9K;4IuUPABmtK#cHES^1uut~1E+wX?rld2a=P1Sy
zn>->YTE_6*u=L1}S{|*N_S!Sk&S-@~b_8%Z{bhtY8t|uQ<hpArEB>3yibIr-io+`u
z2tWV=5P$##AOHafKmY;|fWZGLP`~|UIdXy|AI_My1FzKzXn5G|dM9Df^cyWr)$|2b
zU(gJiH_8RIoL|i4i-p3{Qgq;lRD3&r!~=U5Am(X*grlI_avkZnM%BuiQPz!|URo>`
zOTQd7#g{KD7ex7{T<{770uX=z1Rwwb2tWV=5P$##AOL~8DR6&~b}BX_^{+z6$=FP?
zzdM=!OycQtqI^;|lzZuO@wuDJMAi_100bZa0SG_<0uX=z1R!uX1Xd;z#5DQq=Re&e
z*9$o#zoe^$Bd^8ZQt)UL{CHa-^qP?$bYxliK%V@=LYL$H*~#ea`C{29<ree0q3UC1
tUyj|}TN8KU4NX_|alLukkN-aPW&T`%a7$jzy#EwHDW~drt*DO4{5$fnEm8mg

literal 0
HcmV?d00001

diff --git a/post-service/run.py b/post-service/run.py
new file mode 100644
index 0000000..060d9ef
--- /dev/null
+++ b/post-service/run.py
@@ -0,0 +1,9 @@
+from application import create_app, db
+from application import models
+from flask_migrate import Migrate
+
+app = create_app()
+migrate = Migrate(app, db)
+
+if __name__ == '__main__':
+    app.run(host='0.0.0.0', port=5002)
\ No newline at end of file
diff --git a/user-service/application/__init__.py b/user-service/application/__init__.py
new file mode 100644
index 0000000..95607dd
--- /dev/null
+++ b/user-service/application/__init__.py
@@ -0,0 +1,25 @@
+# application/__init__.py
+from flask import Flask
+from flask_login import LoginManager
+from flask_sqlalchemy import SQLAlchemy
+
+db = SQLAlchemy()
+login_manager = LoginManager()
+
+
+def create_app():
+    app = Flask(__name__)
+    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users-service.db'
+
+    db.init_app(app)
+    login_manager.init_app(app)
+
+    with app.app_context():
+        # Register blueprints
+        from .user_api import user_api_blueprint
+        app.register_blueprint(user_api_blueprint)
+
+        from .models import User
+        db.create_all()
+
+        return app
\ No newline at end of file
diff --git a/user-service/application/__pycache__/__init__.cpython-310.pyc b/user-service/application/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e738032d6c60fb2370b4ce363b02a3cdcbb4cf0e
GIT binary patch
literal 786
zcmYjPOK%e~5VpOKY&RPTRXikw#D&Wq+7(AoR1w-DKxrii73yBB&90l8dLP&hr6`e*
z!kxd69QjMWa_SF2LYx?H6sWEFH2&t{nX&6$FGR3*emy8&6NG-+!_5U8dIqBU00k<r
zKqXEwwmK1{bW*3)9pRQ<>S4sZ1xkJ90Cozu@V=omDEtwMJJ*l_#n^Z+M5Zo4iH7xr
zS4UZuO_+ppIC?W2i2R(DSGo1wEC-YTWFJI*1<*+21)f7SGxUKJq>r?-bZ2M<b!l&-
z&Ct?cq3;i&KBsU+rwry`2X<?QttYUa2+QuAK$NqLR>)f4BLcm-uouwT2t7vX$t8H(
zeF{<l7yHLw?yHZ2YxXorlBr@+?Erk@IomD9=ALb2xc~C-=#(A|-VL4)Mu+s|?W=1H
z#Y3apHiBjir(-c?jpUUE);$3>?nygx6Hr=ZC8N~%d0n0Hi6M|U;1$;p*qENMv!msD
zc%};+1xL+3YZGkJ%Z^R8E!l)C4LAO~&G=<qFrlO!s|j<-GR<fvMC=#`Qni7t@duK(
z!ROCja$c9LZ8bSy>O$8|l3$LYik91SpFptSd8T<?C6u=1(%t6j{~b+ZKb*P?5a1Ap
z#7YDhkpL6&=(n_{<9N$>XZD}0$I)$d+BPlie=xV!47@_N{xZ@9T6Qh;EZ8({?Kj{K
Ya3<(O^Hah0>}#k9Ai{S0#K)2I7v|!`$^ZZW

literal 0
HcmV?d00001

diff --git a/user-service/application/__pycache__/models.cpython-310.pyc b/user-service/application/__pycache__/models.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8bbed81a5dc81aee419379aca7c93a4b604686e7
GIT binary patch
literal 1678
zcmZuxOK;pZ5GM7OylXqQvvyp!F$xr@4)p>B+LI9!P0+_7d$D`bh0rc(uh!HfloZ#C
z-jZwnK@Z8%KcRnx*Pi?f3iQx+hT09*^-7rGa5yBtd9m#GBLd$a{~Yl{kB~ocvii9&
z`3|W52^c4wN|MurQo=26ODne$%gBzjb0=|(>`FKH5|5G}3HP}FmT+ItnJ=6-P7?6o
zjKtv`h2vtXEk3>j3B`b?jcBr5fE@l(3-vPlH7j7!tEcJL-+ap^>ZWQYXubM<1Q@}Q
zf+Uoa#1i(*0dhIz);lZly7_yb+aD<C9PYleli+_^YP8|X-cA$UvvU@^H`Z!<YqkBw
znVYcJ13X)6t+wxJ5htR2wAi~Nc4vEL_hat!;4Mi8Jme9K`+S4<U_9V`z6s+Kz6BxP
z)(!^o90IsesVq;`4Z9LIcmG20euypYwMF)-6*?$dDbumUu=`wGq^)cwn4RT^G6wlM
zP<;ffA@AvLWM(yX<ILPQbf0{HIrBI<Be!%E`w9w)XlI(%Q*C8j+jXOqgF3HmCPjIz
z{j|yu%`MeVE#$>5QIBE$@6+M5%*C(;;KLW9zG}*9IJq9n^3v$O0{!c3B8F*I$!wA~
zSy>G8k_%a%R5yB46cd=R#o>E!Vr>CCqVrvh#mW8k2VUA>YrNb6Vd<su%|hQ)AJnmJ
zyi=PX>!3>O`nptH?ZVW!(6IroZY{1`8tsG9;Mt+`y;VF*g9m^Rya9wg$}#9<06=1E
zG!IYlgyS#NvzV$aSY8VuU`&ZhF?P7TJEHTxxqG?t;8MKHT>2#lcqNd@H;gur1LOjE
zKt49u?;$|4N9S><ql-+{4J*=I=uoCh(G_``N!_caWg%G6=3}9B1O>R1!xo%js+6Mh
z1rwmdtY+z?$zF>%P@jNCVfCp`k$r~jDY9c^CIGl;Z4~^bWV5;~aA%EG;aCn`{VnSK
zHSd|QEKEo7p@!h0BaG>YF{rXuqTFNbRh!CgMPY`t_q>#CUTFX4q7j!u893TIYgATT
zuEqP&8|{Bzg4b!G`)S)uMbThc3$6~(854%!1t`wpT{JDE9^s7<zLhNH94xV{)DvWw
zWc4{RY^D{4<*0mMNcAzWfNawN{5ysZ=yDcVfgRXA+gOhvqr|w_b??Rnr1XkGH)e&x
sCjl}F4Is1e3HEx|_U=pUN3(wgfdOQ?A~@|r`3&Ec8jGz*yZ^xY4+@}tp8x;=

literal 0
HcmV?d00001

diff --git a/user-service/application/models.py b/user-service/application/models.py
new file mode 100644
index 0000000..c0604ec
--- /dev/null
+++ b/user-service/application/models.py
@@ -0,0 +1,40 @@
+# application/models.py
+from . import db
+from datetime import datetime
+from flask_login import UserMixin
+from passlib.hash import sha256_crypt
+
+class User(db.Model, UserMixin):
+    id = db.Column(db.Integer, primary_key=True)
+    email = db.Column(db.String(255), unique=True, nullable=False)
+    phone_number = db.Column(db.String(255), unique=True, nullable =True)
+    uni_number = db.Column(db.Integer, unique=True, nullable=True)
+    user_role = db.Column(db.String(255), unique=False, nullable=False)
+    first_name = db.Column(db.String(255), unique=False, nullable=False)
+    last_name = db.Column(db.String(255), unique=False, nullable=False)
+    authenticated = db.Column(db.Boolean, default=False)
+    password = db.Column(db.String(255), unique=False, nullable=False)
+    api_key = db.Column(db.String(255), unique=True, nullable=True)
+    date_added = db.Column(db.DateTime, default=datetime.utcnow)
+
+    def encode_api_key(self):
+        self.api_key = sha256_crypt.hash(self.id + str(datetime.utcnow))
+
+    def encode_password(self):
+        self.password = sha256_crypt.hash(self.password)
+
+    def __repr__(self):
+        return '<User %r>' % (self.id)
+
+    def to_json(self):
+        return {
+            'first_name': self.first_name,
+            'last_name': self.last_name,
+            'email': self.email,
+            'phone_number' : self.phone_number,
+            'uni_number': self.uni_number,
+            'user_role': self.user_role,
+            'id': self.id,
+            'api_key': self.api_key,
+            'is_active': True
+        }
\ No newline at end of file
diff --git a/user-service/application/user_api/__init__.py b/user-service/application/user_api/__init__.py
new file mode 100644
index 0000000..0c234bf
--- /dev/null
+++ b/user-service/application/user_api/__init__.py
@@ -0,0 +1,6 @@
+# application/user_api/__init__.py
+from flask import Blueprint
+
+user_api_blueprint = Blueprint('user_api', __name__)
+
+from . import routes
\ No newline at end of file
diff --git a/user-service/application/user_api/__pycache__/__init__.cpython-310.pyc b/user-service/application/user_api/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..866a68539d6337adfb16a689adaef5c285d1af57
GIT binary patch
literal 291
zcmYjLu}TCn5KXd|Wj#C)TYF)PGe00ABG}p3Z8PLH;~6g5gk)E-w(|%427f87)%}8%
z$sURi<_$CN&G6i6wImrI>P)@o{#AzmsPb@~E1qXkL{UR5?I<Nk6+`yMx=K}QVHTEm
zoD#(!NL%l-m$Wn;-Ixh|(8HLTDPjQW^`0KII=E@Xc;D8EKN=Z#fn^~z0E4s$kWPOu
zVDtBd1fETwB$UuIecy>EXHgWhxW%{|ofrMf#<=agTj%|=?omkZjqc^B-7pI!ivZAr
Z9sw@=Yicg7Q<K4~5-`@8j_Hz}upg}xPCNhr

literal 0
HcmV?d00001

diff --git a/user-service/application/user_api/__pycache__/routes.cpython-310.pyc b/user-service/application/user_api/__pycache__/routes.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..605f22f7728942301e0362f60d78fd69a56d316b
GIT binary patch
literal 3127
zcmZuzO>Y~?5uNV&;<qSTvMsOIt84-!OtNOOhV$tdyK5V{1k3`q4<Qf`BX&y~dWOU8
z8QLpibW*N+2#{kA;&FleqQ2(jzu-&qsz#(FuV*mL>gr}s*Q-~rCu_GG4z733$Le9n
zasEr4tCx??7kKg=;W)}sB5_hN62ehZxv=F(rtZk)zL$8ZKk{MwDoBDf9EE9ZR7>ll
zI{U(;kv2!ov^8p_?NK}Jj5_SEC0l8C)D@0)r`xKo8vk(4#Hfef4b@aF?(JwX-BoSX
zITC8?JE^*AoBcQ0-%~d({5xuw{kPbEbK}3IZnOV3`}a2fJL)6$@3H^xX8n)VJ@((x
z9Ul2)GqSIKL?hVYN9xn(PXEVmfsE4^wztT&8AtPYe2^^k+{Clut)wAor8=<fBs+>{
z<20H@N7`V%_Y(8pVuI6mZ99!#>9NuIJe%d(hDLw0(0O6QX`apE!;`*eTa$$`dRC0-
zJ+@IT$95BTwzwGRR0Fg?Y_!6QTKRGG`NQ9gC+1{cOlY_3i)<Iq6FhkjP2o(%RF=r|
zcjDY#IfzdVv4o6O-!lPbSRWfRC$@eVCk5g?II;d=Z1MuLLPj7~-#ca(Q{O!s9A~K>
zkazG@=dX%vKA5~Yzy{g(8T_x~i5^7rc@j^eBF<(!Kp+kbBGUQ&IbM}yk>aR{t2trX
zljatFt_4GZ5M4Q#M=(lf>YNKDR^n8Y!rU#zxg^>uZ{?nf!kv0kzZA+xsKLrPm8HZS
z`5ZJy*ul`Yzg!f@nTeOYvt{sAl*f~O>zIp#hm`AA`lKJ)@K{Gmo7}ob8c8#Ho<tMP
zfSGM<#SpmW2AaNW>SW(RV?Ba~v8tMz<h;2FcYJ8F6r^A(Y+)=%i8?LmiH_(Ak8kq{
zT+0S9j2Sy@;m^-rP%=`D-K%_p@y&G&qx*0lIj5ZTbGdS!I)ASNDd*e;Qr^m0q0GMt
z3%>;22_2v!hW+3&D(gl`Vgsa4&y)>|Y)ou5lqFEwQ&ACF*JN*OZB6X=W32-&&TLMb
z$?2b-?1-+YAxQHxbeG*tXoHE-QK7B(^<SUAxE2;6x=H<i&><cxv3C)ilCT8(Tv(DV
z50=Z856fdKfaMqR+%2kpxQEa|pP=y1oYSzBWjGE>2W?miw6!uoTQ9v+uXIn{(m(Z8
z4W35PoVL!}Wk?XR-B~%Xwp6_g&$}x}HU2FDYOSmR)aKAOxP->DDAk~Qloyrh>okfJ
z+nOI|Gd-Ry(gUje#VlUib*?y*CEC{JQJ%lajC!$byacWGBc)LOl8BJ!&>R~e3yY-a
zZ!-g}cbJ*f5Us3t9OcK>%?nc{_m^;*pHuS-YJNp?+7YS&@<WBHmGQ_I=2#k43nD0G
zgGrXAal!dFKf!pveq|9}^D|nGQf&s*(8A^(H9w_>MB_>!wC5RsF#0IYp)|k4U`~u^
z$c9+oJ2H@gsP3vB0@1>FPkPe)0h5<om-Jy_yv7@nk_~UZMTc2X@kUM|5Kux1dGH|*
zBq0xq;5;m9JPS-ZgKt`2N%H^&)8Gtq-r4GuI3p<MMOS&4x2=52`I&fL`2rQj=&9Nn
z6;^#{2%zr;|1dDi`d_l6Bdzx1Sznr8W0XaMt#|EVR_r67YW(d#AxZsSr7RC<CQ0>s
z%2TB}c&!c26Z4QJaAG@pHp!IclM8CbnKi$q;ono!qNYX-RVQx&+u>|-=H5$MgOkQk
zzr=h#RT`4i>b9sMZ#A(aq26C$>}qM_577H-$-xYVSoQ=@PVXbwO{b7&R7xmOC6pux
z8PclnuKRs&$UrT7f6Es8k<n|g@RsH7+BdrjV&6ASyv26oe0-hjZMd&Ma2YXMEZWU=
z*jQiDh6yp^W*4{l3Z3QcOC~<zx_&&+--6ot4^A-`(>dzLFevJ)M=}vnISXNSfdEc3
zinvl|^gZP>se(g!q1fTj{1K~|&(XZ7AlZHr%_#E2c&7GwC-J|CKmG?<Q>i&8+<I}L
z(+}1v3puZq;6*u+rYCEnB|NwLKS=pgIF|Jd0zXLfrV2?MIMMAw7OsM7(^0feEBh{j
zM(ucqR6G8VqpM1U4u10|G#BYKUy|dJzobi7gyu4Xwe?Z-8Z&aLpTOM#S<N$;!~R{f
zNB<<ns49eZY=ab)ljIB>zJs9Luc~+P8BfsJCVR(R5lpbEqL@=1n$RNQPU3_6B*ImZ
zHd)r`I{=>t^r2%r7heHbhn;llTc5v?_?Tp|<Emn^G2XoM56Ail`(7maF@4GK(c1z|
gTVe-Aiq8uOsOL3A=N_Iqp1XKDc*2H|bvm8@4-h@S#{d8T

literal 0
HcmV?d00001

diff --git a/user-service/application/user_api/routes.py b/user-service/application/user_api/routes.py
new file mode 100644
index 0000000..4eccbb1
--- /dev/null
+++ b/user-service/application/user_api/routes.py
@@ -0,0 +1,124 @@
+# application/user_api/routes.py
+from . import user_api_blueprint
+from .. import db, login_manager
+from ..models import User
+from flask import make_response, request, jsonify
+from flask_login import current_user, login_user, logout_user, login_required
+
+from passlib.hash import sha256_crypt
+
+@login_manager.user_loader
+def load_user(user_id):
+    return User.query.filter_by(id=user_id).first()
+
+
+@login_manager.request_loader
+def load_user_from_request(request):
+    api_key = request.headers.get('Authorization')
+    if api_key:
+        api_key = api_key.replace('Basic ', '', 1)
+        user = User.query.filter_by(api_key=api_key).first()
+        if user:
+            return user
+    return None
+
+
+# # for initial user
+# @user_api_blueprint.route('/api/initial-user')
+# def post_initialiser():
+
+#     user = User()
+#     user.email = 'ma04274@surrey.ac.uk'
+#     user.phone_number = '07458633060'
+#     user.uni_number = '6751222'
+#     user.user_role = 'student'
+#     user.first_name = 'mehmet can'
+#     user.last_name = 'aydin'
+#     user.password = '12345'
+
+#     db.session.add(user)
+#     db.session.commit()
+
+#     response = jsonify({'message': 'User added', 'result': user.to_json()})
+
+#     return response
+
+@user_api_blueprint.route('/api/users', methods=['GET'])
+def get_users():
+    data = []
+    for row in User.query.all():
+        data.append(row.to_json())
+
+    response = jsonify(data)
+    return response
+
+
+@user_api_blueprint.route('/api/user/create', methods=['POST'])
+def post_register():
+    first_name = request.form['first_name']
+    last_name = request.form['last_name']
+    email = request.form['email']
+    phone_number = request.form['phone_number']
+    uni_number = request.form['uni_number']
+    user_role = request.form['user_role']
+    
+    password = sha256_crypt.hash((str(request.form['password'])))
+
+    user = User()
+    user.email = email
+    user.first_name = first_name
+    user.last_name = last_name
+    user.password = password
+    uni_number = uni_number
+    phone_number = phone_number
+    user_role = user_role
+    user.authenticated = True
+
+    db.session.add(user)
+    db.session.commit()
+
+    response = jsonify({'message': 'User added', 'result': user.to_json()})
+
+    return response
+
+
+@user_api_blueprint.route('/api/user/login', methods=['POST'])
+def post_login():
+    email = request.form['email']
+    user = User.query.filter_by(email=email).first()
+    if user:
+        if sha256_crypt.verify(str(request.form['password']), user.password):
+            user.encode_api_key()
+            db.session.commit()
+            login_user(user)
+
+            return make_response(jsonify({'message': 'Logged in', 'api_key': user.api_key}))
+
+    return make_response(jsonify({'message': 'Not logged in'}), 401)
+
+
+@user_api_blueprint.route('/api/user/logout', methods=['POST'])
+def post_logout():
+    if current_user.is_authenticated:
+        logout_user()
+        return make_response(jsonify({'message': 'You are logged out'}))
+    return make_response(jsonify({'message': 'You are not logged in'}))
+
+
+@user_api_blueprint.route('/api/user/<email>/exists', methods=['GET'])
+def get_email(email):
+    item = User.query.filter_by(email=email).first()
+    if item is not None:
+        response = jsonify({'result': True})
+    else:
+        response = jsonify({'message': 'Cannot find email'}), 404
+    return response
+
+
+@login_required
+@user_api_blueprint.route('/api/user', methods=['GET'])
+def get_user():
+    if current_user.is_authenticated:
+        return make_response(jsonify({'result': current_user.to_json()}))
+
+    return make_response(jsonify({'message': 'Not logged in'})), 401
diff --git a/user-service/instance/users-service.db b/user-service/instance/users-service.db
new file mode 100644
index 0000000000000000000000000000000000000000..09f88c9460e9db7955f63eef9df415409d72e0dc
GIT binary patch
literal 24576
zcmeI(J#W)M7zglk+=eD1xJ#6Q<xqzt5{(?cv{071#ezVZ(2#;US=abVt;SCAi=YEb
z8Tb(Fd>y_9YZpYN4&3!cttB8EQmg;Tm)Orece(pT9?nW$Z+3%})7?oNvXq)+o+t`g
zrIZj-5Va`kWl_Y*%;kl6m)FxufwbPfsA#{)Y~_elj<oOEH|>))oYoEP5P$##AOHaf
zKmY;|fB*z;qrm6Ba;H|UDqob8?TmSr@L1Nu`oMLDE*&~+U6;xTZInxaPdmM#`^+8C
zUVlh?TixzMS}yUB1!MZg8LU5d1`Wfuo4MwLy-CEqC<}MQDA%)O-z*9)n=Xbvi;55Q
z;>noj@^ho^262*l5exs3GiFm$SeEYbC=Es|<vv~O_q(pslT$cgN%CP5`+uJSI|#ge
zewa&;J$*5h$9!Lm_f!}TI~%SHzZ!HloWVAI>2A|T;5TJ#tJm4wa%tmCFc-OwmTR~I
z%Y`o{(=0dZv&GtzszQRu=O2^zW3j>Z#40Ce*Pi?;Jxjh8>oZdmO_?}bSEnW#GI6F}
zn3~v@iK@7h=H%T}5mnK?5^<nF00Izz00bZa0SG_<0uX=z1R(JL1xCtUVlSxoAJpb*
z#0i;h8OzpclEpDUY_U-*+t-&Z`_YnV>Pz}N^=Fc1zIc!l^1YC!bi^Wd=m$~TFfH5A
z4RcX97Y&Q*?G?*jG4z&c>5uhxS*%OZeh_h>KmY;|fB*y_009U<00Izz00ba#!v$)p
zUHa1_g!BFXG0~21_yRF~2tWV=5P$##AOHafKmY;|fB*!p1n#K|rE9+%IN$%D5bfkD
z1!oX|00bZa0SG_<0uX=z1Rwwb2;35ZqN<j}p9aqN|EEMdy(R0yG9Ul}2tWV=5P$##
SAOHafKmY;|$O)(_Dg6f9B=pz-

literal 0
HcmV?d00001

diff --git a/user-service/requirements.txt b/user-service/requirements.txt
new file mode 100644
index 0000000..3802219
--- /dev/null
+++ b/user-service/requirements.txt
@@ -0,0 +1,40 @@
+alembic==1.4.2
+autoenv==1.0.0
+blinker==1.4
+certifi==2019.11.28
+cffi==1.14.0
+chardet==3.0.4
+click==7.1.1
+cryptography==2.8
+dnspython==1.16.0
+dominate==2.5.1
+Flask==1.1.1
+Flask-Bootstrap==3.3.7.1
+Flask-DotEnv==0.1.2
+Flask-Login==0.5.0
+Flask-Migrate==2.5.3
+Flask-SQLAlchemy==2.4.1
+Flask-Uploads==0.2.1
+Flask-WTF==0.14.3
+gunicorn==20.0.4
+idna==2.9
+itsdangerous==1.1.0
+Jinja2==2.11.1
+Mako==1.1.2
+MarkupSafe==1.1.1
+marshmallow==3.5.1
+passlib==1.7.2
+protobuf==3.6.1
+pycparser==2.20
+PyMySQL==0.9.3
+python-dateutil==2.8.1
+python-do
+tenv==0.12.0
+python-editor==1.0.4
+requests==2.23.0
+six==1.14.0
+SQLAlchemy==1.3.15
+urllib3==1.25.8
+visitor==0.1.3
+Werkzeug==1.0.1
+WTForms==2.2.1
diff --git a/user-service/run.py b/user-service/run.py
new file mode 100644
index 0000000..904225e
--- /dev/null
+++ b/user-service/run.py
@@ -0,0 +1,9 @@
+from application import create_app, db
+from application import models
+from flask_migrate import Migrate
+
+app = create_app()
+migrate = Migrate(app, db)
+
+if __name__ == '__main__':
+    app.run(host='0.0.0.0', port=5001)
\ No newline at end of file
-- 
GitLab