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