import uuid import json from flask import Flask, request, jsonify from flask_cors import CORS import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry class Vacancy: def __init__(self, uuid, title, company, description, salary, resume_uuid): self.uuid = uuid self.title = title self.company = company self.description = description self.salary = salary self.resume_uuid = resume_uuid self.resume_info = None def to_dict(self): if self.resume_info: return { "uuid": self.uuid, "title": self.title, "company": self.company, "description": self.description, "salary": self.salary, "resume_uuid": self.resume_uuid, "resume_info": self.resume_info } else: return { "uuid": self.uuid, "title": self.title, "company": self.company, "description": self.description, "salary": self.salary, "resume_uuid": self.resume_uuid } app = Flask(__name__) CORS(app) vacancies = {} @app.route("/vacancies", methods=["GET"]) def get_vacancies(): return jsonify([vacancy.to_dict() for vacancy in vacancies.values()]) @app.route("/vacancies/", methods=["GET"]) def get_vacancy(vacancy_uuid): vacancy = vacancies.get(vacancy_uuid) if vacancy: if not vacancy.resume_info: vacancy.resume_info = get_resume_info(vacancy.resume_uuid) return jsonify(vacancy.to_dict()) else: return jsonify({"error": "Vacancy not found"}), 404 @app.route("/vacancies", methods=["POST"]) def create_vacancy(): data = request.get_json() vacancy_uuid = str(uuid.uuid4()) vacancy = Vacancy( vacancy_uuid, data["title"], data["company"], data["description"], data["salary"], data["resume_uuid"], ) vacancies[vacancy_uuid] = vacancy vacancy.resume_info = get_resume_info(vacancy.resume_uuid) return jsonify(vacancy.to_dict()), 201 @app.route("/vacancies/", methods=["PUT"]) def update_vacancy(vacancy_uuid): vacancy = vacancies.get(vacancy_uuid) if vacancy: data = request.get_json() vacancy.title = data.get("title", vacancy.title) vacancy.company = data.get("company", vacancy.company) vacancy.description = data.get("description", vacancy.description) vacancy.salary = data.get("salary", vacancy.salary) vacancy.resume_uuid = data.get("resume_uuid", vacancy.resume_uuid) vacancy.resume_info = get_resume_info(vacancy.resume_uuid) return jsonify(vacancy.to_dict()) else: return jsonify({"error": "Vacancy not found"}), 404 @app.route("/vacancies/", methods=["DELETE"]) def delete_vacancy(vacancy_uuid): vacancy = vacancies.get(vacancy_uuid) if vacancy: del vacancies[vacancy_uuid] return "", 200 else: return jsonify({"error": "Vacancy not found"}), 404 def get_resume_info(resume_uuid): url = f'http://resumes-service:5001/resumes/{resume_uuid}' # Настройка retry механизма retries = Retry( total=3, # Максимальное количество повторов status_forcelist=[429, 500, 502, 503, 504], # Коды статуса, для которых нужно повторить запрос backoff_factor=0.3, # Время ожидания перед повторной попыткой ) adapter = HTTPAdapter(max_retries=retries) http = requests.Session() http.mount("https://", adapter) http.mount("http://", adapter) try: response = http.get(url) if response.status_code == 200: return response.json() else: return None except requests.exceptions.RequestException as e: print(f"Ошибка при запросе к resumes-service: {e}") return None if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=5000)