# fgtclb/academic-extensions architecture

> Architecture diagram of the GitHub repository fgtclb/academic-extensions, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/fgtclb/academic-extensions
- Repository: https://github.com/fgtclb/academic-extensions

## Overview

This is a TYPO3 monorepo containing independently released academic extensions, not one application with a single end-to-end workflow. The recurring visitor workflow is a TYPO3 frontend request into an extension controller, which obtains or prepares domain data and assigns it for rendering. Extensions cover people and profile editing, jobs, partners, projects, programs, page contacts, and bite-sized job listings; academic_base supplies shared controller context and configuration utilities. The graph focuses on workflows evidenced by the tree and sampled controllers; other extension capabilities are represented without asserting unsampled wiring.

Main entry points: [`packages/fgtclb/academic-persons/Classes/Controller/ProfileController.php`](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons/Classes/Controller/ProfileController.php) (Profile listings), [`packages/fgtclb/academic-jobs/Classes/Controller/JobController.php`](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-jobs/Classes/Controller/JobController.php) (Job listings), [`packages/fgtclb/academic-partners/Classes/Controller/PartnerController.php`](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-partners/Classes/Controller/PartnerController.php) (Partner listings), [`packages/fgtclb/academic-persons-edit/Classes/Controller/ProfileController.php`](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons-edit/Classes/Controller/ProfileController.php) (Profile editing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_shared["Shared TYPO3"]
  node_basecontext["Plugin context"]
end

subgraph group_people["People and Contacts"]
  node_profiles["Profile listings"]
  node_profileedit["Profile editing"]
  node_profileupdate["Update validation"]
  node_persondata["Profile records"]
  node_contacts["Page contacts"]
  node_contactprovider["Contact provider"]
  node_persons_sync["User sync model<br/>[FrontendUser.php]"]
end

subgraph group_opportunities["Jobs and Partners"]
  node_jobcontroller["Job listings<br/>[JobController.php]"]
  node_jobdata["Job records<br/>[JobRepository.php]"]
  node_partners["Partner listings"]
  node_partnerdata["Partner records"]
  node_partner_map["Partner map<br/>[map.js]"]
  node_bitejobs["Bite job list"]
  node_bite_service["Bite job service"]
end

subgraph group_academic["Academic Listings"]
  node_projects["Project listings"]
  node_programs["Program listings"]
end

node_visitor(("Frontend visitor"))
node_jobmail["Mail service"]

node_visitor -->|"requests"| node_profiles
node_profiles -->|"queries"| node_persondata
node_persondata -->|"returns profiles"| node_profiles
node_profiles -->|"builds context"| node_basecontext
node_visitor -->|"submits edits"| node_profileedit
node_profileedit -->|"validates update"| node_profileupdate
node_visitor -->|"requests"| node_contacts
node_contacts -->|"gets contacts"| node_contactprovider
node_visitor -->|"requests"| node_jobcontroller
node_jobcontroller -->|"queries records"| node_jobdata
node_jobcontroller -->|"sends notice"| node_jobmail
node_visitor -->|"requests"| node_partners
node_partners -->|"queries partners"| node_partnerdata
node_partners -->|"renders map data"| node_partner_map
node_visitor -->|"requests"| node_bitejobs
node_bitejobs -->|"fetches listings"| node_bite_service
node_visitor -->|"requests"| node_projects
node_visitor -->|"requests"| node_programs

click node_basecontext "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-base/Classes/Domain/Model/Dto/PluginControllerActionContext.php"
click node_profiles "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons/Classes/Controller/ProfileController.php"
click node_profileedit "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons-edit/Classes/Controller/ProfileController.php"
click node_profileupdate "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons-edit/Classes/Service/ProfileUpdateValidationService.php"
click node_persondata "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons/Classes/Domain/Repository/ProfileRepository.php"
click node_contacts "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-contact4pages/Classes/Controller/ContactsController.php"
click node_contactprovider "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-contact4pages/Classes/Service/PageContactsProvider.php"
click node_persons_sync "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons-sync/Classes/Domain/Model/FrontendUser.php"
click node_jobcontroller "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-jobs/Classes/Controller/JobController.php"
click node_jobdata "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-jobs/Classes/Domain/Repository/JobRepository.php"
click node_partners "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-partners/Classes/Controller/PartnerController.php"
click node_partnerdata "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-partners/Classes/Domain/Repository/PartnerRepository.php"
click node_partner_map "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-partners/Resources/Public/JavaScript/frontend/map.js"
click node_bitejobs "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-bite-jobs/Classes/Controller/BiteJobsController.php"
click node_bite_service "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-bite-jobs/Classes/Services/BiteJobsService.php"
click node_projects "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-projects/Classes/Controller/ProjectController.php"
click node_programs "https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-programs/Classes/Controller/ProgramController.php"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_basecontext,node_visitor toneBlue
class node_profiles,node_profileedit,node_profileupdate,node_persondata,node_contacts,node_contactprovider,node_persons_sync toneAmber
class node_jobcontroller,node_jobdata,node_partners,node_partnerdata,node_partner_map,node_bitejobs,node_bite_service toneMint
class node_projects,node_programs toneRose
class node_jobmail toneIndigo
```

## Components

### Shared TYPO3

- [Plugin context](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-base/Classes/Domain/Model/Dto/PluginControllerActionContext.php): `packages/fgtclb/academic-base/Classes/Domain/Model/Dto/PluginControllerActionContext.php`

### People and Contacts

- [Profile listings](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons/Classes/Controller/ProfileController.php): `packages/fgtclb/academic-persons/Classes/Controller/ProfileController.php`
- [Profile editing](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons-edit/Classes/Controller/ProfileController.php): `packages/fgtclb/academic-persons-edit/Classes/Controller/ProfileController.php`
- [Update validation](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons-edit/Classes/Service/ProfileUpdateValidationService.php): `packages/fgtclb/academic-persons-edit/Classes/Service/ProfileUpdateValidationService.php`
- [Profile records](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons/Classes/Domain/Repository/ProfileRepository.php): `packages/fgtclb/academic-persons/Classes/Domain/Repository/ProfileRepository.php`
- [Page contacts](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-contact4pages/Classes/Controller/ContactsController.php): `packages/fgtclb/academic-contact4pages/Classes/Controller/ContactsController.php`
- [Contact provider](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-contact4pages/Classes/Service/PageContactsProvider.php): `packages/fgtclb/academic-contact4pages/Classes/Service/PageContactsProvider.php`
- [User sync model](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-persons-sync/Classes/Domain/Model/FrontendUser.php): `packages/fgtclb/academic-persons-sync/Classes/Domain/Model/FrontendUser.php`

### Jobs and Partners

- [Job listings](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-jobs/Classes/Controller/JobController.php): `packages/fgtclb/academic-jobs/Classes/Controller/JobController.php`
- [Job records](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-jobs/Classes/Domain/Repository/JobRepository.php): `packages/fgtclb/academic-jobs/Classes/Domain/Repository/JobRepository.php`
- [Partner listings](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-partners/Classes/Controller/PartnerController.php): `packages/fgtclb/academic-partners/Classes/Controller/PartnerController.php`
- [Partner records](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-partners/Classes/Domain/Repository/PartnerRepository.php): `packages/fgtclb/academic-partners/Classes/Domain/Repository/PartnerRepository.php`
- [Partner map](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-partners/Resources/Public/JavaScript/frontend/map.js): `packages/fgtclb/academic-partners/Resources/Public/JavaScript/frontend/map.js`
- [Bite job list](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-bite-jobs/Classes/Controller/BiteJobsController.php): `packages/fgtclb/academic-bite-jobs/Classes/Controller/BiteJobsController.php`
- [Bite job service](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-bite-jobs/Classes/Services/BiteJobsService.php): `packages/fgtclb/academic-bite-jobs/Classes/Services/BiteJobsService.php`

### Academic Listings

- [Project listings](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-projects/Classes/Controller/ProjectController.php): `packages/fgtclb/academic-projects/Classes/Controller/ProjectController.php`
- [Program listings](https://github.com/fgtclb/academic-extensions/blob/main/packages/fgtclb/academic-programs/Classes/Controller/ProgramController.php): `packages/fgtclb/academic-programs/Classes/Controller/ProgramController.php`

### Other components

- **Frontend visitor**
- **Mail service**

## Connections

- Frontend visitor → Profile listings: requests
- Profile listings → Profile records: queries
- Profile records → Profile listings: returns profiles
- Profile listings → Plugin context: builds context
- Frontend visitor → Profile editing: submits edits
- Profile editing → Update validation: validates update
- Frontend visitor → Page contacts: requests
- Page contacts → Contact provider: gets contacts
- Frontend visitor → Job listings: requests
- Job listings → Job records: queries records
- Job listings → Mail service: sends notice
- Frontend visitor → Partner listings: requests
- Partner listings → Partner records: queries partners
- Partner listings → Partner map: renders map data
- Frontend visitor → Bite job list: requests
- Bite job list → Bite job service: fetches listings
- Frontend visitor → Project listings: requests
- Frontend visitor → Program listings: requests
