Module - Propriétés

Le module de propriétés immobilières permet de gérer l'ensemble des biens immobiliers disponibles sur la plateforme. Il prend en charge différents types de propriétés (maisons, appartements, terrains, bureaux, etc.) avec leurs caractéristiques spécifiques.

Types de propriétés

Endpoints

GET
/properties

Récupérer la liste des propriétés avec filtrage possible

Paramètres de requête

  • type : type de propriété (house, apartment, land, etc.)
  • transactionType : type de transaction (SALE, RENT)
  • minPrice : prix minimum
  • maxPrice : prix maximum
  • municipality : ville/municipalité
  • ownerId : ID du propriétaire
  • categoryId : ID de la catégorie de propriété
  • status : statut de la propriété (AVAILABLE, SOLD, RENTED, PENDING, SUSPENDED)
  • page : numéro de page pour la pagination (défaut: 1)
  • limit : nombre d'éléments par page (défaut: 10)

Exemple de réponse

{
  "properties": [
    {
      "id": "cm5p90ics0001v2zzx604cd5p",
      "title": "Villa moderne avec piscine",
      "description": "Magnifique villa avec vue sur mer...",
      "price": 1200000,
      "transactionType": "SALE",
      "status": "AVAILABLE",
      "latitude": 43.7102,
      "longitude": 7.2620,
      "municipality": "Nice",
      "address": "123 Avenue des Palmiers",
      "area": 250,
      "createdAt": "2023-09-15T14:30:00Z",
      "updatedAt": "2023-09-15T14:30:00Z",
      "ownerId": "cm2y6lhu50000fspuentp5fx2",
      "categoryId": "cat123",
      "images": [
        {
          "id": "img123",
          "url": "https://example.com/image1.jpg"
        }
      ],
      "house": {
        "id": "house123",
        "propertyId": "cm5p90ics0001v2zzx604cd5p",
        "rooms": 6,
        "bedrooms": 4,
        "bathrooms": 3,
        "swimmingPool": true,
        "parkingSpace": true
      }
    }
  ],
  "totalItems": 45,
  "totalPages": 5,
  "itemsPerPage": 10,
  "currentPage": 1
}
GET
/properties/:id

Récupérer les détails d'une propriété spécifique

Exemple de réponse

{
  "id": "cm5p90ics0001v2zzx604cd5p",
  "title": "Villa moderne avec piscine",
  "description": "Magnifique villa avec vue sur mer...",
  "price": 1200000,
  "transactionType": "SALE",
  "status": "AVAILABLE",
  "latitude": 43.7102,
  "longitude": 7.2620,
  "municipality": "Nice",
  "address": "123 Avenue des Palmiers",
  "area": 250,
  "createdAt": "2023-09-15T14:30:00Z",
  "updatedAt": "2023-09-15T14:30:00Z",
  "ownerId": "cm2y6lhu50000fspuentp5fx2",
  "categoryId": "cat123",
  "propertyCategory": {
    "id": "cat123",
    "name": "Villa",
    "description": "Villas de luxe"
  },
  "owner": {
    "id": "owner123",
    "user": {
      "id": "cm2y6lhu50000fspuentp5fx2",
      "name": "Jean Dupont",
      "email": "jean.dupont@example.com",
      "phone": "+33612345678"
    }
  },
  "images": [
    {
      "id": "img123",
      "url": "https://example.com/image1.jpg",
      "description": "Vue extérieure"
    },
    {
      "id": "img124",
      "url": "https://example.com/image2.jpg",
      "description": "Salle de séjour"
    }
  ],
  "videos": [],
  "house": {
    "id": "house123",
    "propertyId": "cm5p90ics0001v2zzx604cd5p",
    "rooms": 6,
    "bedrooms": 4,
    "bathrooms": 3,
    "swimmingPool": true,
    "parkingSpace": true
  }
}

Création d'une propriété (processus en 2 étapes)

La création d'une propriété se fait en deux étapes distinctes :

  1. Étape 1 : Créer la propriété avec les informations communes
  2. Étape 2 : Ajouter les informations spécifiques selon le type de propriété
POST
/properties

Étape 1 : Créer la propriété avec les informations communes

Corps de la requête

{
  "title": "Villa moderne avec piscine",
  "description": "Magnifique villa avec vue sur mer...",
  "price": 1200000,
  "transactionType": "SALE",
  "latitude": 43.7102,
  "longitude": 7.2620,
  "municipality": "Nice",
  "address": "123 Avenue des Palmiers",
  "area": 250,
  "ownerId": "cm2y6lhu50000fspuentp5fx2",
  "categoryId": "cat123"
}

Réponse

{
  "id": "cm5p90ics0001v2zzx604cd5p",
  "title": "Villa moderne avec piscine",
  "description": "Magnifique villa avec vue sur mer...",
  "price": 1200000,
  "transactionType": "SALE",
  "latitude": 43.7102,
  "longitude": 7.2620,
  "municipality": "Nice",
  "address": "123 Avenue des Palmiers",
  "area": 250,
  "status": "PENDING",
  "ownerId": "cm2y6lhu50000fspuentp5fx2",
  "categoryId": "cat123",
  "createdAt": "2023-09-15T14:30:00Z",
  "updatedAt": "2023-09-15T14:30:00Z"
}

Étape 2 : Ajouter les informations spécifiques selon le type de propriété

Une fois la propriété créée, vous devez ajouter les détails spécifiques en fonction du type de propriété.

POST
/houses

Pour une maison (House)

Corps de la requête

{
  "propertyId": "cm5p90ics0001v2zzx604cd5p",
  "rooms": 6,
  "bedrooms": 4,
  "bathrooms": 3,
  "swimmingPool": true,
  "parkingSpace": true
}
POST
/apartments

Pour un appartement (Apartment)

Corps de la requête

{
  "propertyId": "cm5p90ics0001v2zzx604cd5p",
  "rooms": 3,
  "bedrooms": 2,
  "bathrooms": 1,
  "parkingSpace": true,
  "swimmingPool": false,
  "floors": 3,
  "balcony": true,
  "elevator": true
}
POST
/lands

Pour un terrain (Land)

Corps de la requête

{
  "propertyId": "cm5p90ics0001v2zzx604cd5p",
  "serviced": true,
  "landType": "BUILDABLE"
}
POST
/offices

Pour un bureau (Office)

Corps de la requête

{
  "propertyId": "cm5p90ics0001v2zzx604cd5p",
  "floors": 2,
  "parkingSpace": true,
  "elevators": true,
  "typeOfActivity": "COMMERCIAL"
}
POST
/commercials

Pour un local commercial (Commercial)

Corps de la requête

{
  "propertyId": "cm5p90ics0001v2zzx604cd5p",
  "floors": 1,
  "elevators": false,
  "parkingSpace": true,
  "typeOfActivity": "RETAIL"
}
POST
/hotels

Pour un hôtel (Hotels)

Corps de la requête

{
  "propertyId": "cm5p90ics0001v2zzx604cd5p",
  "rooms": 50,
  "floors": 4,
  "parkingSpace": true,
  "swimmingPool": true
}
POST
/developments

Pour un projet immobilier (Development)

Corps de la requête

{
  "propertyId": "cm5p90ics0001v2zzx604cd5p",
  "numberOfUnits": 25,
  "typeOfActivity": "RESIDENTIAL"
}
PATCH
/properties/:id

Mettre à jour les informations communes d'une propriété

Corps de la requête

{
  "title": "Villa moderne avec piscine et jardin",
  "price": 1250000,
  "status": "AVAILABLE"
}
PATCH
/houses/:id

Mettre à jour les informations spécifiques d'une maison

Corps de la requête

{
  "swimmingPool": true,
  "parkingSpace": true,
  "rooms": 7
}
DELETE
/properties/:id

Supprimer une propriété (supprime également les données spécifiques associées)

Modèles de données

Voici la structure de base du modèle Property :

model Property {
  id                String            @id @default(cuid())
  title             String
  description       String
  price             Float
  latitude          Float
  longitude         Float
  transactionType   TransactionType
  municipality      String
  address           String
  area              Float
  images            Image[]
  videos            Video[]
  createdAt         DateTime          @default(now())
  updatedAt         DateTime          @updatedAt
  status            PropertyStatus    @default(PENDING)
  ownerId           String
  owner             Owner             @relation(fields: [ownerId], references: [id], onDelete: Cascade)
  categoryId        String
  propertyCategory  PropertyCategory  @relation(fields: [categoryId], references: [id])
  appointments      Appointment[]
  favorites         Favorite[]
  house             House?
  apartment         Apartment?
  land              Land?
  commercial        Commercial?
  office            Office?
  development       Development?
  hotels            Hotels?
  notification      Notification[]
}

Énumération TransactionType

enum TransactionType {
  RENT
  SALE
}

Énumération PropertyStatus

enum PropertyStatus {
  AVAILABLE
  SOLD
  RENTED
  PENDING
  SUSPENDED
}

Modèle House

model House {
  id                String          @id @default(cuid())
  propertyId        String          @unique
  rooms             Int
  bedrooms          Int
  bathrooms         Int
  swimmingPool      Boolean
  parkingSpace      Boolean
  property          Property        @relation(fields: [propertyId], references: [id], onDelete: Cascade)
}

Modèle Apartment

model Apartment {
  id                String          @id @default(cuid())
  propertyId        String          @unique
  rooms             Int
  bedrooms          Int
  bathrooms         Int
  parkingSpace      Boolean
  swimmingPool      Boolean
  floors            Int
  balcony           Boolean
  elevator          Boolean
  property          Property        @relation(fields: [propertyId], references: [id], onDelete: Cascade)
}