Vés al contingut

Estructura de fitxers

El backend segueix l'estructura estàndard d'un projecte Symfony 6, amb algunes capes addicionals per a la lògica ETL i les agrupacions.

Arbre de directoris

visor2030-backend/
├── bin/
│   └── console              Punt d'entrada de les comandes Symfony
├── config/
│   ├── packages/            Configuració de cada bundle (doctrine, api_platform, security…)
│   ├── routes/              Definicions de rutes (api_platform.yaml, security.yaml…)
│   └── services.yaml        Registre de serveis (autowiring activat)
├── migrations/              Migracions Doctrine (una per cada canvi d'esquema)
├── public/
│   └── index.php            Front controller web
├── src/                     Tot el codi de l'aplicació
├── tests/
│   ├── Unit/
│   ├── Integration/
│   └── Functional/
└── var/
    ├── cache/               Caché de Symfony (s'esborra amb cache:clear)
    └── log/                 Logs de l'aplicació

El directori src/

src/
├── ApiResource/             Definicions de recursos API Platform desacoblades de les entitats
├── Command/                 Comandes de consola (app:*)
├── Config/                  Classes de configuració de l'aplicació
├── Controller/
│   ├── Back/                (no s'utilitza)
│   ├── Front/               (no s'utilitza)
│   ├── AuthController.php   Endpoint d'autenticació JWT
│   ├── ETLController.php    Disparador ETL via HTTP
│   ├── CsvExportController.php
│   ├── MunicipalityValueController.php
│   ├── LabelHierarchyController.php
│   └── SyntheticSdgController.php
├── Doctrine/                Extensions de consulta Doctrine (filtres globals)
├── Dto/                     Data Transfer Objects
├── Entity/                  Entitats Doctrine ORM (model de dades)
├── Filter/                  Filtres personalitzats per a API Platform
├── OpenApi/                 Personalitzacions de la documentació OpenAPI/Swagger
├── Repository/              Repositoris Doctrine (un per entitat)
├── Security/
│   └── WebserviceVus/       Autenticadors SSO per a la xarxa DIBA (opcional)
├── Service/                 Lògica de negoci
│   ├── Etl/                 Importadors ETL i serveis auxiliars
│   │   ├── Importer/        AbstractEtlImporter + 17 importadors concrets
│   │   ├── Dto/             IndicatorDefinition, EtlContext
│   │   ├── Enum/            ImportScope
│   │   ├── Geo/             GeoRegistry (lookups de municipi/comarca/província)
│   │   ├── Indicator/       IndicatorFactory (crea Target/Indicator)
│   │   ├── Persistence/     ValuePersister (upsert de *Value)
│   │   ├── Source/          IdescatJsonClient, IdescatTableClient, DoClient
│   │   └── Util/            EtlUtils + NameGenderGuesser (helpers purs)
│   ├── Aggregation/         Estratègies de càlcul d'agrupacions
│   ├── ETLService.php       Dispatcher de l'ETL (descobreix els importadors)
│   ├── AggregationCalculatorService.php  Càlcul d'agrupacions
│   ├── CsvExportService.php Exportació CSV
│   ├── LoadMunicipalityDataService.php   Càrrega de dades inicials (municipis, etc.)
│   └── BudgetImporter.php   Importació de pressupostos
└── Util/                    Utilitats (IndicatorCalculator)

On va cada cosa

Quan t'incorpores al projecte o afegiu una funcionalitat nova, aquí tens la guia ràpida:

TascaOn treballar
Afegir un camp a una taulasrc/Entity/ + generar migració
Nova consulta a la BBDDsrc/Repository/
Nova lògica de negocisrc/Service/
Nou endpoint API Platformsrc/Entity/ (atributs #[ApiResource], #[ApiFilter])
Nou endpoint personalitzatsrc/Controller/
Nova comanda CLIsrc/Command/
Nou importador ETLsrc/Service/Etl/ (extendre AbstractEtlImporter)
Nova estratègia d'agrupaciósrc/Service/Aggregation/ (implementar AggregationStrategyInterface)
Canviar configuració de bundleconfig/packages/{bundle}.yaml

Convencions del projecte

  • Entitats: PHP 8 attributes per a Doctrine ORM i API Platform. No hi ha fitxers XML ni YAML de mapatge.
  • Serialització: grups (#[Groups(['group_name'])]) controlen quins camps apareixen a les respostes JSON.
  • Filtres API Platform: declarats directament a l'entitat amb #[ApiFilter(...)]. No cal cap controlador addicional.
  • Consultes complexes: les consultes pesades fan servir SQL nadiu via $em->getConnection()->executeQuery() als repositoris.
  • Memòria en comandes: totes les comandes ETL usen ini_set('memory_limit', '1024M') al constructor.

Publicat sota llicència MIT