Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions backend/app/main.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
import subprocess

import logging
from flask import Flask
from flask_cors import CORS
from flask_restx import Api

# Configuração básica de logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

from src.infrastructure.routes.education.view import education_ns
from src.infrastructure.routes.experiences.view import experiences_ns

Expand All @@ -17,6 +12,9 @@
from src.infrastructure.routes.projects.view import projects_ns
from src.infrastructure.routes.social_media.view import social_media_ns
from src.infrastructure.dependencie_injection import ApplicationDependencies
from src.infrastructure.utils.logger import get_logger

logger = get_logger(__name__)

class ApplicationSetup:
def __init__(self):
Expand Down
48 changes: 48 additions & 0 deletions backend/logs/portfolio_api.log
Original file line number Diff line number Diff line change
Expand Up @@ -260,3 +260,51 @@ Detalhes do erro:
2025-09-25 14:34:39,236 - portfolio_api - ERROR - Error getting experiences: Test error
2025-09-25 14:34:39,246 - portfolio_api - ERROR - Error getting projects: Test error
2025-09-25 14:34:39,254 - portfolio_api - ERROR - Error getting social media: Test error
ERROR - src.infrastructure.routes.education.view - Error getting education: Test error
ERROR - src.infrastructure.routes.experiences.view - Error getting experiences: Test error
ERROR - src.infrastructure.routes.projects.view - Error getting projects: Test error
ERROR - src.infrastructure.routes.social_media.view - Error getting social media: Test error
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de projetos não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 projetos no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de experiências não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 experiências no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de formações não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 formações no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de certificações não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 certificações no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de redes sociais não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 redes sociais no cache...
INFO - src.infrastructure.services.portfolio_data_service - [CACHE HIT] 4 projetos recuperados do cache
INFO - src.infrastructure.services.portfolio_data_service - [CACHE HIT] 4 experiências recuperadas do cache
ERROR - src.infrastructure.routes.education.view - Error getting education: Test error
ERROR - src.infrastructure.routes.experiences.view - Error getting experiences: Test error
ERROR - src.infrastructure.routes.projects.view - Error getting projects: Test error
ERROR - src.infrastructure.routes.social_media.view - Error getting social media: Test error
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de projetos não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 projetos no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de experiências não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 experiências no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de formações não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 formações no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de certificações não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 certificações no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de redes sociais não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 redes sociais no cache...
INFO - src.infrastructure.services.portfolio_data_service - [CACHE HIT] 4 projetos recuperados do cache
INFO - src.infrastructure.services.portfolio_data_service - [CACHE HIT] 4 experiências recuperadas do cache
ERROR - src.infrastructure.routes.education.view - Error getting education: Test error
ERROR - src.infrastructure.routes.experiences.view - Error getting experiences: Test error
ERROR - src.infrastructure.routes.projects.view - Error getting projects: Test error
ERROR - src.infrastructure.routes.social_media.view - Error getting social media: Test error
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de projetos não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 projetos no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de experiências não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 experiências no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de formações não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 formações no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de certificações não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 certificações no cache...
WARNING - src.infrastructure.services.portfolio_data_service - [CACHE MISS] Dados de redes sociais não encontrados no cache. Buscando no repositório...
INFO - src.infrastructure.services.portfolio_data_service - Salvando 4 redes sociais no cache...
INFO - src.infrastructure.services.portfolio_data_service - [CACHE HIT] 4 projetos recuperados do cache
INFO - src.infrastructure.services.portfolio_data_service - [CACHE HIT] 4 experiências recuperadas do cache
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@
from src.domain.dto.project import Project
from src.domain.dto.social_media import SocialMedia
from src.infrastructure.ports.repository_interface import RepositoryInterface
from src.infrastructure.utils.logger import logger
from src.infrastructure.utils.logger import get_logger

logger = get_logger(__name__)


class PostgresAdapter(RepositoryInterface):
Expand Down
10 changes: 7 additions & 3 deletions backend/src/infrastructure/adapters/outbound_redis_adapter.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""Redis Adapter for caching portfolio data."""

import json
import os
from typing import Optional, List, Dict, Any
Expand All @@ -11,7 +13,9 @@
from src.domain.dto.project import Project
from src.domain.dto.social_media import SocialMedia
from src.infrastructure.ports.cache_provider_interface import CacheProvider
from src.infrastructure.utils.logger import logger
from src.infrastructure.utils.logger import get_logger

logger = get_logger(__name__)


class RedisAdapter(CacheProvider):
Expand Down Expand Up @@ -42,7 +46,7 @@ def __init__(self) -> None:
try:
self.redis.ping()
except RedisError as e:
logger.error(f"Redis Connection Error: {e}")
logger.error(f"Erro de conexão com o Redis: {str(e)}", exc_info=True)
raise

def get_cache_data_by_key(self, key: str):
Expand All @@ -52,7 +56,7 @@ def get_cache_data_by_key(self, key: str):
return None
return json.loads(data)
except RedisError as e:
logger.error(f"Redis GET Key Error: {e}")
logger.error(f"Erro ao obter chave do Redis: {str(e)}", exc_info=True)
raise

def get_all_projects(self) -> [] or List[Project]:
Expand Down
26 changes: 14 additions & 12 deletions backend/src/infrastructure/dependencie_injection.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,39 @@
import logging
from src.infrastructure.adapters.outbound_postgres_adapter import PostgresAdapter
from src.infrastructure.adapters.outbound_redis_adapter import RedisAdapter
from src.infrastructure.services.portfolio_data_service import PortfolioDataService
from src.infrastructure.utils.logger import get_logger

logger = logging.getLogger(__name__)
logger = get_logger(__name__)

class ApplicationDependencies:
_instance = None

def __new__(cls):
if cls._instance is None:
logger.info("🚀 Criando nova instância de ApplicationDependencies")
logger.info("Criando nova instância de ApplicationDependencies")
cls._instance = super().__new__(cls)

try:
logger.info("🔄 Inicializando PostgresAdapter...")
logger.info("Inicializando PostgresAdapter...")
cls._instance.data_repository = PostgresAdapter()
logger.info("✅ PostgresAdapter inicializado com sucesso!")
logger.info("🔄 Inicializando RedisAdapter...")
logger.info("PostgresAdapter inicializado com sucesso")

logger.info("Inicializando RedisAdapter...")
cls._instance.cache_provider = RedisAdapter()
logger.info("✅ RedisAdapter inicializado com sucesso!")
logger.info("🔄 Inicializando PortfolioDataService...")
logger.info("RedisAdapter inicializado com sucesso")

logger.info("Inicializando PortfolioDataService...")
cls._instance.portfolio_data_service = PortfolioDataService(
cls._instance.data_repository, cls._instance.cache_provider
)
logger.info("PortfolioDataService inicializado com sucesso!")
logger.info("PortfolioDataService inicializado com sucesso")

except Exception as e:
logger.error(f"Erro ao inicializar ApplicationDependencies: {str(e)}")
logger.error(f"Erro ao inicializar ApplicationDependencies: {str(e)}", exc_info=True)
raise

logger.info("🎉 ApplicationDependencies inicializado com sucesso!")
logger.info("ApplicationDependencies inicializado com sucesso")
else:
logger.info("♻️Reutilizando instância existente de ApplicationDependencies")
logger.info("Reutilizando instância existente de ApplicationDependencies")

return cls._instance
4 changes: 3 additions & 1 deletion backend/src/infrastructure/routes/education/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
from flask_restx import Namespace, Resource

from src.infrastructure.utils.constants import HTTP_INTERNAL_SERVER_ERROR
from src.infrastructure.utils.logger import logger
from src.infrastructure.utils.logger import get_logger
from src.infrastructure.dependencie_injection import ApplicationDependencies

logger = get_logger(__name__)

def get_portfolio_data_service():
return ApplicationDependencies().portfolio_data_service

Expand Down
4 changes: 3 additions & 1 deletion backend/src/infrastructure/routes/experiences/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
def get_portfolio_data_service():
return ApplicationDependencies().portfolio_data_service
from src.infrastructure.utils.constants import HTTP_INTERNAL_SERVER_ERROR
from src.infrastructure.utils.logger import logger
from src.infrastructure.utils.logger import get_logger

logger = get_logger(__name__)

experiences_ns = Namespace("Experiences", description="Companies experiences")

Expand Down
4 changes: 3 additions & 1 deletion backend/src/infrastructure/routes/projects/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
def get_portfolio_data_service():
return ApplicationDependencies().portfolio_data_service
from src.infrastructure.utils.constants import HTTP_INTERNAL_SERVER_ERROR
from src.infrastructure.utils.logger import logger
from src.infrastructure.utils.logger import get_logger

logger = get_logger(__name__)

projects_blueprint = Blueprint("projects_bp", __name__)
projects_ns = Namespace(
Expand Down
4 changes: 3 additions & 1 deletion backend/src/infrastructure/routes/social_media/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
def get_portfolio_data_service():
return ApplicationDependencies().portfolio_data_service
from src.infrastructure.utils.constants import HTTP_INTERNAL_SERVER_ERROR
from src.infrastructure.utils.logger import logger
from src.infrastructure.utils.logger import get_logger

logger = get_logger(__name__)

social_media_blueprint = Blueprint("social_media_bp", __name__)
social_media_ns = Namespace(
Expand Down
47 changes: 23 additions & 24 deletions backend/src/infrastructure/services/portfolio_data_service.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import logging
from src.domain.dto.certification import Certification
from src.domain.dto.company_duration import CompanyDuration
from src.domain.dto.experience import Experience
Expand All @@ -7,9 +6,9 @@
from src.domain.dto.social_media import SocialMedia
from src.infrastructure.ports.repository_interface import RepositoryInterface
from src.infrastructure.ports.cache_provider_interface import CacheProvider
from src.infrastructure.utils.logger import get_logger


logger = logging.getLogger(__name__)
logger = get_logger(__name__)

class PortfolioDataService:
"""Portfolio Data Service"""
Expand All @@ -23,13 +22,13 @@ def projects(self) -> list[Project]:
cache_projects = self.cache_provider.get_all_projects()

if cache_projects:
logger.info(f"[CACHE HIT] {len(cache_projects)} projetos recuperados do cache")
logger.info(f"[CACHE HIT] {len(cache_projects)} projetos recuperados do cache")
return cache_projects

logger.warning("⚠️ [CACHE MISS] Dados de projetos não encontrados no cache. Buscando no repositório...")
logger.warning("[CACHE MISS] Dados de projetos não encontrados no cache. Buscando no repositório...")
repository_projects = self.data_repository.get_all_projects()

logger.info(f"💾 Salvando {len(repository_projects)} projetos no cache...")
logger.info(f"Salvando {len(repository_projects)} projetos no cache...")
self.cache_provider.set_projects(repository_projects)

return repository_projects
Expand All @@ -40,13 +39,13 @@ def experiences(self) -> list[Experience]:
cache_experiences = self.cache_provider.get_all_experiences()

if cache_experiences:
logger.info(f"[CACHE HIT] {len(cache_experiences)} experiências recuperadas do cache")
logger.info(f"[CACHE HIT] {len(cache_experiences)} experiências recuperadas do cache")
return cache_experiences

logger.warning("⚠️ [CACHE MISS] Dados de experiências não encontrados no cache. Buscando no repositório...")
logger.warning("[CACHE MISS] Dados de experiências não encontrados no cache. Buscando no repositório...")
repository_experiences = self.data_repository.get_all_experiences()

logger.info(f"💾 Salvando {len(repository_experiences)} experiências no cache...")
logger.info(f"Salvando {len(repository_experiences)} experiências no cache...")
self.cache_provider.set_experiences(repository_experiences)

return repository_experiences
Expand All @@ -55,13 +54,13 @@ def companies_duration(self) -> list[CompanyDuration]:
cached_companies_duration = self.cache_provider.get_company_duration()

if cached_companies_duration:
logger.info("[CACHE HIT] Durações de empresas recuperadas do cache")
logger.info("[CACHE HIT] Durações de empresas recuperadas do cache")
return cached_companies_duration

logger.warning("⚠️ [CACHE MISS] Dados de duração de empresas não encontrados no cache. Buscando no repositório...")
logger.warning("[CACHE MISS] Dados de duração de empresas não encontrados no cache. Buscando no repositório...")
repository_companies_duration = self.data_repository.get_company_duration()

logger.info("💾 Salvando durações de empresas no cache...")
logger.info("Salvando durações de empresas no cache...")
self.cache_provider.set_company_duration(repository_companies_duration)

return repository_companies_duration
Expand All @@ -71,13 +70,13 @@ def formations(self) -> list[Formation]:
cached_formations = self.cache_provider.get_all_formations()

if cached_formations:
logger.info(f"[CACHE HIT] {len(cached_formations)} formações recuperadas do cache")
logger.info(f"[CACHE HIT] {len(cached_formations)} formações recuperadas do cache")
return cached_formations

logger.warning("⚠️ [CACHE MISS] Dados de formações não encontrados no cache. Buscando no repositório...")
logger.warning("[CACHE MISS] Dados de formações não encontrados no cache. Buscando no repositório...")
repository_formations = self.data_repository.get_all_formations()

logger.info(f"💾 Salvando {len(repository_formations)} formações no cache...")
logger.info(f"Salvando {len(repository_formations)} formações no cache...")
self.cache_provider.set_formations(repository_formations)

return repository_formations
Expand All @@ -87,13 +86,13 @@ def certifications(self) -> list[Certification]:
cached_certifications = self.cache_provider.get_all_certifications()

if cached_certifications:
logger.info(f"[CACHE HIT] {len(cached_certifications)} certificações recuperadas do cache")
logger.info(f"[CACHE HIT] {len(cached_certifications)} certificações recuperadas do cache")
return cached_certifications

logger.warning("⚠️ [CACHE MISS] Dados de certificações não encontrados no cache. Buscando no repositório...")
logger.warning("[CACHE MISS] Dados de certificações não encontrados no cache. Buscando no repositório...")
repository_certifications = self.data_repository.get_all_certifications()

logger.info(f"💾 Salvando {len(repository_certifications)} certificações no cache...")
logger.info(f"Salvando {len(repository_certifications)} certificações no cache...")
self.cache_provider.set_certifications(repository_certifications)

return repository_certifications
Expand All @@ -103,13 +102,13 @@ def social_media(self) -> list[SocialMedia]:
cached_social_media = self.cache_provider.get_all_social_media()

if cached_social_media:
logger.info(f"[CACHE HIT] {len(cached_social_media)} redes sociais recuperadas do cache")
logger.info(f"[CACHE HIT] {len(cached_social_media)} redes sociais recuperadas do cache")
return cached_social_media

logger.warning("⚠️ [CACHE MISS] Dados de redes sociais não encontrados no cache. Buscando no repositório...")
logger.warning("[CACHE MISS] Dados de redes sociais não encontrados no cache. Buscando no repositório...")
repository_social_media = self.data_repository.get_all_social_media()

logger.info(f"💾 Salvando {len(repository_social_media)} redes sociais no cache...")
logger.info(f"Salvando {len(repository_social_media)} redes sociais no cache...")
self.cache_provider.set_social_media(repository_social_media)

return repository_social_media
Expand All @@ -119,13 +118,13 @@ def total_experience(self) -> dict:
cached_total_experience = self.cache_provider.get_total_experience()

if cached_total_experience:
logger.info("[CACHE HIT] Experiência total recuperada do cache")
logger.info("[CACHE HIT] Experiência total recuperada do cache")
return cached_total_experience

logger.warning("⚠️ [CACHE MISS] Dados de experiência total não encontrados no cache. Buscando no repositório...")
logger.warning("[CACHE MISS] Dados de experiência total não encontrados no cache. Buscando no repositório...")
repository_total_experience = self.data_repository.get_total_experience()

logger.info("💾 Salvando experiência total no cache...")
logger.info("Salvando experiência total no cache...")
self.cache_provider.set_total_experience(repository_total_experience)

return repository_total_experience
Loading