"""Vector order jobs statuses actions handlers.""" from flask import Response, jsonify, request from marshmallow.exceptions import ValidationError from owsresponse import response, status from owsresponse.adaptors.flask import flaskify from vectororder.api import app from vectororder.constants import error as error_constants, jobs as jobs_constants from vectororder.logic import jobs from vectororder.models.schemas import DeliveryType, EncodingOrderType from vectororder.schemas import jobs_status_schema from vectororder.utils import handlers @app.route("/jobs/status", methods=["PUT"]) def jobs_status_action() -> Response: """Handle actions on Vector jobs.""" try: request_data = handlers.parse_request_json( schema=jobs_status_schema.JobsStatusPUTSchema ) except ValidationError as e: res = response.create_error_response( code=error_constants.ERROR_CODE_VALIDATION, status=400, message=e.messages ) return flaskify(res) action = request_data[jobs_constants.FIELD_ACTION] job_ids = request_data[jobs_constants.FIELD_JOB_IDS] result = jobs.perform_status_action(action=action, job_ids=job_ids) if not result: return Response(status=status.NO_CONTENT) else: return jsonify(result) @app.route("/jobs//eligibility", methods=["GET"]) def get_job_eligibility(job_id: int) -> Response: """Get the eligibility of a Vector job.""" result = jobs.get_job_eligibility(job_id) return jsonify(result.model_dump(mode="json")) @app.route("/jobs//delivery-file-download", methods=["GET"]) def get_job_delivery_xml(job_id: int) -> Response: """Get a delivery XML of a Vector job.""" result = jobs.get_job_delivery_xml_payload(job_id) return jsonify(result.model_dump(mode="json")) @app.route("/products//eligibility", methods=["GET"]) def get_product_eligibility(upc: int) -> Response: """Get store delivery eligibility status for given UPC.""" store_id = request.args.get("store_id", type=int) delivery_type = request.args.get("delivery_type", type=DeliveryType) order_type = request.args.get( "order_type", type=EncodingOrderType, default=EncodingOrderType.RELEASE, # default for backwareds compatibility ) if store_id is None or delivery_type is None: res = response.create_error_response( code=error_constants.ERROR_CODE_VALIDATION, status=400, message=error_constants.ERROR_MESSAGE_MISSING_QUERY_PARAMS, ) return flaskify(res) result = jobs.get_product_eligibility(upc, store_id, delivery_type, order_type) return Response(result.model_dump_json(), mimetype="application/json")