Skip to content

feat(repositories): implementación de la capa de repositorios y abstracción de acceso a datos#7

Merged
Ochoa-Stack merged 3 commits into
developfrom
feature/repository-layer
Jun 10, 2026
Merged

feat(repositories): implementación de la capa de repositorios y abstracción de acceso a datos#7
Ochoa-Stack merged 3 commits into
developfrom
feature/repository-layer

Conversation

@Ochoa-Stack

Copy link
Copy Markdown
Owner

feature/repository-layer

Descripción

Se integra el patrón de diseño Repositorio para encapsular y centralizar la interacción con la base de datos mediante SQLAlchemy. Esto establece una barrera arquitectónica que aísla las consultas de los controladores y servicios, garantizando escalabilidad y mantenimiento limpio.

Decisiones técnicas integradas:

  • Abstracción Base (BaseRepository): Centraliza las operaciones CRUD fundamentales (get_all, get_by_id, create, update, delete) e incorpora gestión de transacciones segura (rollbacks automáticos ante excepciones) para proteger la integridad de los datos.
  • Repositorios Específicos: Creación de 9 clases dedicadas (CategoryRepository, CityRepository, SkillRepository, JobRepository, JobSkillRepository, UserRepository, AlertRepository, TrendSnapshotRepository, BackupRepository) que heredan la lógica del constructor genérico inyectando su modelo correspondiente, evitando duplicidad de código.
  • Encapsulamiento (__init__.py): Actúa como fachada del módulo, exponiendo de manera limpia únicamente las 9 clases instanciables y manteniendo el BaseRepository oculto para evitar su uso directo en capas superiores.

Tipo de cambio

  • feat
  • fix
  • refactor
  • chore
  • docs
  • test

Cómo probar

  1. Tras el merge, actualizar la rama base localmente: git checkout develop && git pull origin develop
  2. Navegar a la raíz del backend: cd backend
  3. Asegurar que el entorno virtual esté activo y abrir la interfaz interactiva de la aplicación:
    flask --app run shell
  4. Ejecutar la importación del paquete y validar que la abstracción se haya resuelto sin errores:
    from app.repositories import UserRepository
    repo = UserRepository()
    print(repo.model) # Debe retornar la clase <class 'app.models.user.User'>
  5. Salir del entorno interactivo ejecutando exit().

Checklist

  • Sigue las convenciones de commits del proyecto
  • Las pruebas existentes pasan sin errores (sin conflictos de importación o dependencias circulares)
  • Se agregaron pruebas para el nuevo comportamiento (si aplica)
  • No se incluyen archivos .env ni credenciales

Copilot AI review requested due to automatic review settings June 10, 2026 01:07
@Ochoa-Stack Ochoa-Stack merged commit 21d1d4f into develop Jun 10, 2026
1 check passed
@Ochoa-Stack Ochoa-Stack deleted the feature/repository-layer branch June 10, 2026 01:10

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR introduce una capa de repositorios para centralizar el acceso a datos con SQLAlchemy, aislando la lógica CRUD de controladores/servicios y estableciendo una base común reutilizable.

Changes:

  • Se agrega BaseRepository con operaciones CRUD genéricas usando db.session.
  • Se crean repositorios específicos por entidad que heredan de BaseRepository e inyectan su modelo.
  • Se expone una fachada de importación en app.repositories vía __init__.py para uso directo desde capas superiores.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
backend/app/repositories/base_repository.py Implementa el repositorio base con CRUD y manejo de transacciones (commit/rollback).
backend/app/repositories/init.py Expone los repositorios específicos como API pública del paquete.
backend/app/repositories/category_repository.py Repositorio específico para Category basado en BaseRepository.
backend/app/repositories/city_repository.py Repositorio específico para City basado en BaseRepository.
backend/app/repositories/skill_repository.py Repositorio específico para Skill basado en BaseRepository.
backend/app/repositories/job_repository.py Repositorio específico para Job basado en BaseRepository.
backend/app/repositories/job_skill_repository.py Repositorio específico para JobSkill basado en BaseRepository.
backend/app/repositories/user_repository.py Repositorio específico para User basado en BaseRepository.
backend/app/repositories/alert_repository.py Repositorio específico para Alert basado en BaseRepository.
backend/app/repositories/trend_snapshot_repository.py Repositorio específico para TrendSnapshot basado en BaseRepository.
backend/app/repositories/backup_repository.py Repositorio específico para Backup basado en BaseRepository.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +20 to +22
except Exception as e:
db.session.rollback()
raise e
Comment on lines +32 to +34
except Exception as e:
db.session.rollback()
raise e
Comment on lines +44 to +46
except Exception as e:
db.session.rollback()
raise e No newline at end of file
Comment on lines +10 to +11
def get_by_id(self, id):
return db.session.get(self.model, id)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants