API REST en Spring Boot para gestionar propiedades de arriendo, contratos y reseñas con capacidades geoespaciales usando PostgreSQL + PostGIS.
- Java 17+
- Docker y Docker Compose
- Maven (o usar el incluido
mvnw)
# 1. Iniciar PostgreSQL con PostGIS
docker-compose up -d
# 2. Ejecutar la aplicacion
./mvnw spring-boot:runLa API estara disponible en http://localhost:8080
| Tecnologia | Proposito |
|---|---|
| Spring Boot 3.2.2 | Framework |
| PostgreSQL + PostGIS | Base de datos con soporte geoespacial |
| Hibernate 6 + JTS | ORM con tipos geometricos |
| Jackson | Serializacion JSON |
| Lombok | Reduccion de boilerplate |
| Metodo | Endpoint | Descripcion |
|---|---|---|
GET |
/ |
Listar todas las propiedades |
GET |
/{id} |
Obtener propiedad por ID |
GET |
/nearby?latitude=&longitude=&radius= |
Buscar propiedades cercanas |
POST |
/ |
Crear propiedad |
PUT |
/{id} |
Actualizar propiedad |
DELETE |
/{id} |
Eliminar propiedad |
Ejemplo crear propiedad:
POST /api/properties
{
"ownerId": 1,
"addressText": "Av. Providencia 1234",
"description": "Departamento 2D1B",
"latitude": -33.4289,
"longitude": -70.6100
}Busqueda por cercania:
GET /api/properties/nearby?latitude=-33.4289&longitude=-70.6100&radius=0.01
radius=0.01grados = aproximadamente 1.1 km
| Metodo | Endpoint | Descripcion |
|---|---|---|
GET |
/ |
Listar todos los arriendos |
GET |
/{id} |
Obtener arriendo por ID |
GET |
/by-property/{propertyId} |
Obtener por propiedad |
GET |
/by-tenant/{tenantId} |
Obtener por arrendatario |
GET |
/by-owner/{ownerId} |
Obtener por propietario |
POST |
/ |
Crear arriendo |
PUT |
/{id} |
Actualizar arriendo |
DELETE |
/{id} |
Eliminar arriendo |
Ejemplo crear arriendo:
POST /api/tenancies
{
"propertyId": 1,
"tenantId": 3,
"status": "ACTIVE",
"startDate": "2024-01-15"
}Estados de arriendo: INVITED, ACCEPTED, ACTIVE, ENDED, REJECTED
| Metodo | Endpoint | Descripcion |
|---|---|---|
GET |
/ |
Listar todas las resenas |
GET |
/{id} |
Obtener resena por ID |
GET |
/by-author/{authorId} |
Resenas escritas por usuario |
GET |
/by-target/{targetId} |
Resenas sobre usuario |
GET |
/nearby?latitude=&longitude=&radius= |
Buscar resenas en zona |
GET |
/average-rating/{userId} |
Rating promedio del usuario |
POST |
/ |
Crear resena |
PUT |
/{id} |
Actualizar resena |
DELETE |
/{id} |
Eliminar resena |
Ejemplo crear resena con factores de riesgo:
POST /api/reviews
{
"authorId": 1,
"targetId": 3,
"tenancyId": 1,
"rating": 5,
"comment": "Excelente arrendatario!",
"latitude": -33.4289,
"longitude": -70.6100,
"riskFactors": [
{ "factor": "PAYS_ON_TIME", "value": true, "note": "Siempre paga antes del 5" },
{ "factor": "PROPERTY_CARE", "value": true },
{ "factor": "GOOD_COMMUNICATION", "value": true }
]
}| Metodo | Endpoint | Descripcion |
|---|---|---|
GET |
/ |
Listar todos los usuarios |
GET |
/{id} |
Obtener usuario por ID |
GET |
/by-email?email= |
Buscar usuario por email |
Factores de riesgo tipados para evaluar arrendatarios y propietarios:
| Factor | Descripcion |
|---|---|
PAYS_ON_TIME |
Paga el arriendo a tiempo |
PROPERTY_CARE |
Cuida la propiedad |
NOISE_COMPLAINTS |
Causa ruidos molestos |
GOOD_COMMUNICATION |
Se comunica bien |
RESPECTS_LEASE |
Respeta los terminos del contrato |
LEFT_IN_GOOD_CONDITION |
Dejo la propiedad en buen estado |
PROPERTY_DAMAGE |
Causo danos a la propiedad |
UNAUTHORIZED_OCCUPANTS |
Tuvo ocupantes no autorizados |
UNAUTHORIZED_PETS |
Tuvo mascotas no autorizadas |
| Factor | Descripcion |
|---|---|
RESPONDS_QUICKLY |
Responde rapido a problemas |
DOES_MAINTENANCE |
Realiza mantenimiento regular |
RETURNS_DEPOSIT |
Devuelve la garantia correctamente |
MATCHES_DESCRIPTION |
La propiedad coincide con el anuncio |
RESPECTS_PRIVACY |
Respeta la privacidad del arrendatario |
PROPER_DOCUMENTATION |
Entrega documentacion correcta |
ILLEGAL_DEDUCTIONS |
Hace deducciones ilegales |
ENTERS_WITHOUT_NOTICE |
Entra sin aviso previo |
flowchart LR
A[Propietario crea Propiedad] --> B[Propietario invita Arrendatario]
B --> C{Tiene cuenta?}
C -->|Si| D[INVITED con tenantId]
C -->|No| E[INVITED con email]
D --> F[Arrendatario acepta]
E --> G[Arrendatario se registra y acepta]
F --> H[ACTIVE]
G --> H
H --> I[Contrato termina]
I --> J[ENDED]
J --> K[Ambos pueden dejar Resenas]
| Estado | Descripcion |
|---|---|
INVITED |
Invitacion enviada, esperando respuesta |
ACCEPTED |
Arrendatario acepto la invitacion |
ACTIVE |
Arriendo en curso |
ENDED |
Arriendo terminado |
REJECTED |
Arrendatario rechazo la invitacion |
La aplicacion carga datos de prueba automaticamente al iniciar.
| ID | Rol | Nombre | |
|---|---|---|---|
| 1 | propietario1@arriendacheck.com | LANDLORD | Carlos Perez |
| 2 | propietario2@arriendacheck.com | LANDLORD | Maria Gonzalez |
| 3 | arrendatario1@arriendacheck.com | TENANT | Juan Silva |
| 4 | arrendatario2@arriendacheck.com | TENANT | Ana Rodriguez |
| 5 | arrendatario3@arriendacheck.com | TENANT | Pedro Martinez |
| ID | Direccion | Dueno | Coordenadas |
|---|---|---|---|
| 1 | Av. Providencia 1234 | Carlos | -33.4289, -70.6100 |
| 2 | Las Condes 5678 | Carlos | -33.4100, -70.5500 |
| 3 | Vicuna Mackenna 910, Nunoa | Maria | -33.4530, -70.5980 |
| 4 | Av. Italia 2345 | Maria | -33.4400, -70.6200 |
| 5 | Gran Avenida 6789, San Miguel | Carlos | -33.4900, -70.6500 |
| Propiedad | Arrendatario | Estado | Fechas |
|---|---|---|---|
| Providencia 1234 | Juan | ACTIVE | 2024-01-15 - presente |
| Las Condes 5678 | Ana | ACTIVE | 2024-03-01 - presente |
| Nunoa | Pedro | ENDED | 2023 - 2024 |
| Av. Italia | Juan | ENDED | 2022 - 2023 |
| San Miguel | (invitado) | INVITED | pendiente |
| Autor | Rating | Evaluado | Comentario |
|---|---|---|---|
| Carlos | 5 | Juan | "Excelente arrendatario" |
| Juan | 4 | Carlos | "Buen propietario" |
| Maria | 2 | Pedro | "Pagos atrasados" |
| Pedro | 3 | Maria | "Regular" |
| Carlos | 5 | Juan | "Impecable como siempre" |
# Listar propiedades
Invoke-RestMethod http://localhost:8080/api/properties
# Buscar propiedades cercanas
Invoke-RestMethod "http://localhost:8080/api/properties/nearby?latitude=-33.4289&longitude=-70.6100&radius=0.02"
# Ver resenas de Juan (ID=3)
Invoke-RestMethod http://localhost:8080/api/reviews/by-target/3
# Rating promedio de Juan
Invoke-RestMethod http://localhost:8080/api/reviews/average-rating/3
# Arriendos de Carlos como propietario
Invoke-RestMethod http://localhost:8080/api/tenancies/by-owner/1# Listar propiedades
curl http://localhost:8080/api/properties
# Crear propiedad
curl -X POST http://localhost:8080/api/properties \
-H "Content-Type: application/json" \
-d '{"ownerId":1,"addressText":"Nueva Direccion","latitude":-33.45,"longitude":-70.65}'src/main/java/com/arriendaCheck/demo/
├── config/ # Configuracion de Jackson y Security
├── controller/ # Controladores REST
├── domain/
│ ├── entity/ # Entidades JPA
│ └── enums/ # Role, TenancyStatus, RiskFactor
├── dto/ # DTOs de Request/Response
├── repository/ # Repositorios JPA
└── service/ # Logica de negocio
Configuraciones principales en application.properties:
# Base de datos
spring.datasource.url=jdbc:postgresql://localhost:5432/arriendacheck_db
spring.datasource.username=arriendacheck
spring.datasource.password=arriendacheck
# JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
# Datos de prueba se cargan automaticamente al iniciar
spring.sql.init.mode=alwaysMIT