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