def login_user(): ''' Check credentials and send auth token ''' try: username = request.authorization["username"] password = request.authorization["password"] if not username or not password: raise InvalidRequest("Missing username or password.") user = User.query.filter_by(username=username).first() if not user: raise AuthenticationError("User does not exist.") if not BCRYPT.check_password_hash(user.password, password): raise AuthenticationError("Username or Password wrong.") auth_token = user.encode_auth_token(user.id) return parse_response(200, data={ "token": auth_token.decode(), "user_id": user.id }) except (InvalidRequest, AuthenticationError) as exp: return parse_response(exp.code, str(exp)) except BadRequest as exp: return parse_response(400, "Could not parse payload.") except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def delete_user(req_uid, user_id): ''' Delete an user ''' try: user_id = int(user_id) req_user = User.query.filter_by(id=req_uid).first() if req_user.id != user_id and not is_admin(req_uid): raise AuthorizationError user = User.query.filter_by(id=user_id).first() if not user: raise ValueError DB.session.delete(user) DB.session.commit() return parse_response( 200, "{0} successfully deleted.".format(user.username)) except AuthorizationError as exp: return parse_response(exp.code, str(exp)) except ValueError: return parse_response(404, "User does not exist.") except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def add_process(req_user): ''' Add a process to the registry''' try: if not req_user["admin"]: raise AuthorizationError payload = request.get_json() if not payload: raise InvalidRequest("Invalid payload.") validate_process(payload) process_id = payload["process_id"] description = payload["description"] process_type = payload["type"] args = payload["args"] if process_type == "operation": git_uri = payload["git_uri"] git_ref = payload["git_ref"] git_dir = payload["git_dir"] else: git_uri = None git_ref = None git_dir = None does_exist = Process.query.filter_by(process_id=process_id).first() if does_exist: raise InvalidRequest("The process already exists.") process = Process(user_id=req_user["id"], process_id=process_id, description=description, git_uri=git_uri, git_ref=git_ref, git_dir=git_dir, process_type=process_type, args=args) DB.session.add(process) DB.session.commit() return parse_response(200, data={"process_id": process.id}) except (AuthorizationError, ValidationError, InvalidRequest) as exp: return parse_response(exp.code, str(exp)) except ValueError as exp: return parse_response(400, "Invalid payload.") except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def identify_user(req_uid): '''Return users identity ''' try: user = User.query.filter_by(id=req_uid).first() if not user: raise AuthenticationError("User does not exist.") return parse_response(200, data=user.get_dict()) except AuthenticationError as exp: return parse_response(exp.code, str(exp)) except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def get_all_users(req_uid): ''' Get all users ''' try: if not is_admin(req_uid): raise AuthorizationError users = User.query.order_by(User.created_at.desc()).all() all_users = [] for user in users: all_users.append(user.get_dict()) return parse_response(200, data=all_users) except AuthorizationError as exp: return parse_response(exp.code, str(exp)) except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def add_user(req_uid): ''' Add a user to the database. ''' try: if not is_admin(req_uid): raise AuthorizationError payload = request.get_json() if not payload: raise InvalidRequest("Invalid payload.") validate_user(payload) username = payload.get("username") email = payload.get("email") admin = payload.get("admin") password = payload.get("password") ex_user = User.query.filter_by(username=username).first() ex_email = User.query.filter_by(email=email).first() if ex_user or ex_email: raise InvalidRequest("The username or e-mail already exists.") new_user = User(username=username, password=password, email=email, admin=admin) DB.session.add(new_user) DB.session.commit() return parse_response(201, "{0} successfully created.".format(username)) except (AuthorizationError, ValidationError, InvalidRequest) as exp: return parse_response(exp.code, str(exp)) except (exc.IntegrityError, ValueError): return parse_response(400, "Invalid payload.") except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def get_process_details(process_id): ''' Detailed information about specific process that includes sensitive information ''' # TODO: Authentification / service message broker try: process_id = process_id.lower() if process_id == "min_time": process_id = "min-time" process = Process.query.filter_by(process_id=process_id).first() if not process: raise InvalidRequest("Process does not exist.") return parse_response(200, data=process.get_dict()) except InvalidRequest as exp: return parse_response(exp.code, str(exp)) except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def delete_process(req_user, process_id): ''' Delete process ''' try: if not req_user["admin"]: raise AuthorizationError process = Process.query.filter_by(process_id=process_id).first() if not process: raise InvalidRequest("Process does not exist.") DB.session.delete(process) DB.session.commit() return parse_response( 200, "Process {0} sucesssfully deleted.".format(process_id)) except (InvalidRequest, AuthorizationError) as exp: return parse_response(exp.code, str(exp)) except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def alter_process(req_user, process_id): ''' Alter values of process in namespace''' try: if not req_user["admin"]: raise AuthorizationError payload = request.get_json() if not payload: raise InvalidRequest("Invalid payload.") validate_process(payload) process = Process.query.filter_by(process_id=process_id).first() if not process: raise InvalidRequest("Process does not exist.") process.process_id = payload["process_id"] process.description = payload["description"] process.process_type = payload["type"] process.args = payload["args"] if payload["type"] == "operation": process.git_uri = payload["git_uri"] process.git_ref = payload["git_ref"] process.git_dir = payload["git_dir"] DB.session.commit() return parse_response( 200, "Process {0} sucesssfully altered.".format(process_id)) except (InvalidRequest, AuthorizationError) as exp: return parse_response(exp.code, str(exp)) except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def get_user(req_uid, user_id): ''' Get detail of user ''' try: user_id = int(user_id) req_user = User.query.filter_by(id=req_uid).first() if req_user.id != user_id and not is_admin(req_uid): raise AuthorizationError user = User.query.filter_by(id=user_id).first() if not user: raise ValueError return parse_response(200, data=user.get_dict()) except AuthorizationError as exp: return parse_response(exp.code, str(exp)) except ValueError: return parse_response(404, "The user does not exist.") except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def change_user(req_uid): ''' Change users details ''' try: if not is_admin(req_uid): raise AuthorizationError payload = request.get_json() if not payload: raise InvalidRequest("Invalid payload.") validate_user(payload) username = payload.get("username") email = payload.get("email") admin = payload.get("admin") password = payload.get("password") ex_user = User.query.filter_by(username=username).first() ex_user.username = username ex_user.email = email ex_user.password = User.generate_hash(password) ex_user.admin = admin DB.session.commit() return parse_response(201, "{0} successfully created.".format(username)) except (AuthorizationError, ValidationError, InvalidRequest) as exp: return parse_response(exp.code, str(exp)) except (exc.IntegrityError, ValueError): return parse_response(400, "Invalid payload.") except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def get_all_processes(): ''' Information about all processes that are available ''' # TODO: Authentification / service message broker try: processes = Process.query.order_by(Process.process_id).all() all_processes = [] for process in processes: desc = process.get_description() desc["process_id"] = desc["process_id"].lower() if desc["process_id"] == "min-time": desc["process_id"] = "min_time" if desc["process_id"] == "ndvi": desc["process_id"] = "NDVI" all_processes.append(desc) return parse_response(200, data=all_processes) except OperationalError as exp: return parse_response(503, "The service is currently unavailable.")
def verify_user(req_uid): ''' Verify auth token and return users id ''' return parse_response(200, req_uid)
def logout_user(req_uid): ''' Get auth token and log out ''' return parse_response(200, "Successfully logged out.")
def options_process_id(process_id): return parse_response(200)
def options_auth_login(): return parse_response(200)
def get_process_opensearch(req_user, process_id): ''' Get process using opensearch''' # TODO: Implement! return parse_response( 501, "This API feature is not supported by the back-end.")
def options_process_id_opensearch(): return parse_response(200)
def health(): ''' Check Health of Service ''' return parse_response(200, "Running!")
def options_process(): return parse_response(200)
def options_process_id_details(process_id): return parse_response(200)