#!/usr/bin/env python3 import datetime from flask_jwt_extended import create_access_token, jwt_required from flask_restful import Resource from flask import request, current_app from db import db from models import User from schemas import UserSchema, UserMetadataSchema """ Flask Restful endpoints """ __author__ = '@tormakris' __copyright__ = "Copyright 2020, videON Team" __module_name__ = "resources" __version__text__ = "1" class SignupApi(Resource): """ See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/createuser """ userschema = UserSchema(many=False) usermetadataschema = UserMetadataSchema(many=False) def post(self): body = request.get_json() try: userobj = self.userschema.load(body) except Exception as e: current_app.logger.exception(e) return {'status': 'error', 'message': 'Input JSON schema invalid'}, 417 user = User(name=userobj['name'], password=userobj['password']) try: user.hash_password() db.session.add(user) db.session.commit() except Exception as e: db.session.rollback() current_app.logger.exception(e) return {'status': 'error', 'message': 'db transaction error'}, 503 return self.usermetadataschema.dump(user), 200 class LoginApi(Resource): """ See: https://swagger.kmlabz.com/?urls.primaryName=videON%20Backend#/backend/logon """ userschema = UserSchema(many=False) usermetadataschema = UserMetadataSchema(many=False) def post(self): body = request.get_json() try: userobj = self.userschema.load(body) except Exception as e: current_app.logger.exception(e) return {'status': 'error', 'message': 'Input JSON schema invalid'}, 417 user = User.query.filter_by(name=userobj['name']).first() authorized = user.check_password(userobj['password']) if not authorized: return {'status': 'error', 'message': 'username or password invalid'}, 401 try: user.last_logon = datetime.datetime.now() db.session.add(user) db.session.commit() except Exception as e: db.session.rollback() current_app.logger.exception(e) return {'status': 'error', 'message': 'db transaction error'}, 503 expires = datetime.timedelta(days=7) access_token = create_access_token(identity=str(user.name), expires_delta=expires) return {'token': access_token}, 200