diff --git a/Makefile b/Makefile
deleted file mode 100644
index 948fba48bbed1be2133bb61652222ff2d1cc2e86..0000000000000000000000000000000000000000
--- 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 eba4b363f09dd0b0e8774be6eaecf1bfd98c1517..0000000000000000000000000000000000000000
--- 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 a094c3cc7cf35c78f9b508127300fd3e41b97fb3..0000000000000000000000000000000000000000
--- 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 92887f224117508f7daf37829c911707aaa165ea..0000000000000000000000000000000000000000
--- 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 61a8842448df585342bb87463911a8c9fdd88793..0000000000000000000000000000000000000000
--- 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 626d92345a2ac65267ec2eb6930a921a8110e226..0000000000000000000000000000000000000000
--- 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 f5af13c53976869ebd935356efd60c837003cb6a..0000000000000000000000000000000000000000
--- 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 302eef18127edc0ff6b4d28b69e64e0bfde36d9d..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..004ea8198f04bc4135623de89ddbce26fabebcd6
--- /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 0000000000000000000000000000000000000000..ec1eb90edd92ab441a922dcf0e6e642802922a14
--- /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 0000000000000000000000000000000000000000..3e4b5c9411be4d40b17795c13f73cbbe8c026a35
--- /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 0000000000000000000000000000000000000000..c43873a503fe6eeffa131df0340a881060017dfb
--- /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 0000000000000000000000000000000000000000..cc1449abf5644693d06ee3b2c8fcac0e61d65cf5
--- /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 0000000000000000000000000000000000000000..20207dcea3051c9152c1281e75af561555c1fb63
--- /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 7593f7ff81e067d248e6b1aa8dadc06e2cc89a06..0000000000000000000000000000000000000000
--- 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 b67070cae7ed97b1da3ddb1100541b7bb77292ee..0000000000000000000000000000000000000000
--- 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 02fa1be2fa5c8dc948c09c6b3cdae4aeed1215db..0000000000000000000000000000000000000000
--- 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 2409fb1b3e42a40a7ec1612521d1e3737390d2a9..0000000000000000000000000000000000000000
--- 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 f5af13c53976869ebd935356efd60c837003cb6a..0000000000000000000000000000000000000000
--- 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 259962717b87d2bdf620b33fe735b274fca9b174..0000000000000000000000000000000000000000
--- 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 0a22db6fab62edd972cdc4a48f76122e9752c96d..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..b1ef5454c948732dfe103e2f00ab86f1575f5762
--- /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
Binary files /dev/null and b/post-service/application/__pycache__/__init__.cpython-310.pyc differ
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
Binary files /dev/null and b/post-service/application/__pycache__/models.cpython-310.pyc differ
diff --git a/post-service/application/models.py b/post-service/application/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb46f062be623ec61bc14dd01c2d65ea34fd1461
--- /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 0000000000000000000000000000000000000000..3b204700712baca000e0a7fae156fd97cfbbed4e
--- /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
Binary files /dev/null and b/post-service/application/post_api/__pycache__/__init__.cpython-310.pyc differ
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
Binary files /dev/null and b/post-service/application/post_api/__pycache__/routes.cpython-310.pyc differ
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 0000000000000000000000000000000000000000..b76ec7944197c5ab0387401eb33a4db6268577cb
--- /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
Binary files /dev/null and b/post-service/application/post_api/api/__pycache__/UserClient.cpython-310.pyc differ
diff --git a/post-service/application/post_api/routes.py b/post-service/application/post_api/routes.py
new file mode 100644
index 0000000000000000000000000000000000000000..11ef2e39a10d0ab36815283a692d04b1d1f5f6bc
--- /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
Binary files /dev/null and b/post-service/instance/posts-service.db differ
diff --git a/post-service/run.py b/post-service/run.py
new file mode 100644
index 0000000000000000000000000000000000000000..060d9eff2d826e08a4af15b60ebc5f6ceaed4064
--- /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 0000000000000000000000000000000000000000..95607ddbcf5e305bff698e46e4cf1ffc18f09831
--- /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
Binary files /dev/null and b/user-service/application/__pycache__/__init__.cpython-310.pyc differ
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
Binary files /dev/null and b/user-service/application/__pycache__/models.cpython-310.pyc differ
diff --git a/user-service/application/models.py b/user-service/application/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..c0604ecd0aedcc25fa79d1c468f4855e6a7687ba
--- /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 0000000000000000000000000000000000000000..0c234bf72afaa80c99bfe0762d3409ae6630e439
--- /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
Binary files /dev/null and b/user-service/application/user_api/__pycache__/__init__.cpython-310.pyc differ
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
Binary files /dev/null and b/user-service/application/user_api/__pycache__/routes.cpython-310.pyc differ
diff --git a/user-service/application/user_api/routes.py b/user-service/application/user_api/routes.py
new file mode 100644
index 0000000000000000000000000000000000000000..4eccbb16d3cf6ac921bc1fbae4268d85a89ff56a
--- /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
Binary files /dev/null and b/user-service/instance/users-service.db differ
diff --git a/user-service/requirements.txt b/user-service/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..38022197d7102b1863953ffe074ba7fa2ef2d02e
--- /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 0000000000000000000000000000000000000000..904225e4cbbb48db1362af6a0c051acfae7ae1fe
--- /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