You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.5 KiB
Markdown
150 lines
3.5 KiB
Markdown
# TED Notice URL Feature
|
|
|
|
## Übersicht
|
|
|
|
Jedes Dokument in der Datenbank hat jetzt eine automatisch generierte `notice_url` Spalte, die direkt auf die TED-Webseite verlinkt.
|
|
|
|
## Format
|
|
|
|
```
|
|
https://ted.europa.eu/en/notice/-/detail/{publication_id ohne führende Nullen}
|
|
```
|
|
|
|
**Beispiel:**
|
|
- `publication_id`: `00786665-2025`
|
|
- `notice_url`: `https://ted.europa.eu/en/notice/-/detail/786665-2025`
|
|
|
|
## Automatische Generierung
|
|
|
|
Die URL wird automatisch beim Speichern eines Dokuments generiert:
|
|
|
|
```java
|
|
@PrePersist
|
|
@PreUpdate
|
|
private void generateNoticeUrl() {
|
|
if (publicationId != null && !publicationId.isEmpty()) {
|
|
String cleanId = publicationId.replaceFirst("^0+", "");
|
|
this.noticeUrl = "https://ted.europa.eu/en/notice/-/detail/" + cleanId;
|
|
}
|
|
}
|
|
```
|
|
|
|
## Datenbankstruktur
|
|
|
|
### Spalte
|
|
|
|
```sql
|
|
ALTER TABLE ted.procurement_document
|
|
ADD COLUMN notice_url VARCHAR(255);
|
|
|
|
CREATE INDEX idx_doc_notice_url ON ted.procurement_document(notice_url);
|
|
```
|
|
|
|
### Existierende Datensätze
|
|
|
|
URLs für existierende Datensätze werden automatisch generiert:
|
|
|
|
```sql
|
|
UPDATE ted.procurement_document
|
|
SET notice_url = 'https://ted.europa.eu/en/notice/-/detail/' ||
|
|
REGEXP_REPLACE(publication_id, '^0+', '')
|
|
WHERE publication_id IS NOT NULL
|
|
AND notice_url IS NULL;
|
|
```
|
|
|
|
## Verwendung
|
|
|
|
### Repository-Abfrage
|
|
|
|
```java
|
|
// Nach URL suchen
|
|
Optional<ProcurementDocument> doc = repository.findByNoticeUrl(
|
|
"https://ted.europa.eu/en/notice/-/detail/786665-2025"
|
|
);
|
|
```
|
|
|
|
### Entity-Zugriff
|
|
|
|
```java
|
|
ProcurementDocument doc = new ProcurementDocument();
|
|
doc.setPublicationId("00786665-2025");
|
|
// notice_url wird automatisch beim Speichern generiert
|
|
repository.save(doc);
|
|
|
|
// URL abrufen
|
|
String url = doc.getNoticeUrl();
|
|
// "https://ted.europa.eu/en/notice/-/detail/786665-2025"
|
|
```
|
|
|
|
### REST API Beispiel
|
|
|
|
```json
|
|
{
|
|
"id": "20fde305-844b-46b7-bb72-93e86381978d",
|
|
"publicationId": "00786665-2025",
|
|
"noticeUrl": "https://ted.europa.eu/en/notice/-/detail/786665-2025",
|
|
"buyerName": "Example Organization",
|
|
"projectTitle": "Construction Services"
|
|
}
|
|
```
|
|
|
|
## Vorteile
|
|
|
|
✅ **Direkte Verlinkung** zur offiziellen TED-Webseite
|
|
✅ **Automatische Generierung** - keine manuelle Pflege nötig
|
|
✅ **Indiziert** für schnelle Suche
|
|
✅ **Konsistentes Format** - einheitliche URLs
|
|
✅ **Integration** in REST API und Such-Ergebnisse
|
|
|
|
## SQL-Abfragen
|
|
|
|
### URL für Publication ID generieren
|
|
|
|
```sql
|
|
SELECT
|
|
publication_id,
|
|
'https://ted.europa.eu/en/notice/-/detail/' ||
|
|
REGEXP_REPLACE(publication_id, '^0+', '') AS notice_url
|
|
FROM ted.procurement_document
|
|
WHERE publication_id = '00786665-2025';
|
|
```
|
|
|
|
### Alle URLs anzeigen
|
|
|
|
```sql
|
|
SELECT
|
|
publication_id,
|
|
notice_url,
|
|
buyer_name,
|
|
project_title
|
|
FROM ted.procurement_document
|
|
WHERE notice_url IS NOT NULL
|
|
ORDER BY created_at DESC
|
|
LIMIT 10;
|
|
```
|
|
|
|
### Nach URL-Pattern suchen
|
|
|
|
```sql
|
|
SELECT *
|
|
FROM ted.procurement_document
|
|
WHERE notice_url LIKE '%/786665-2025';
|
|
```
|
|
|
|
## Migration
|
|
|
|
Beim Hinzufügen des Features wurden:
|
|
|
|
1. ✅ Spalte `notice_url` zur Tabelle hinzugefügt
|
|
2. ✅ Index `idx_doc_notice_url` erstellt
|
|
3. ✅ URLs für alle existierenden Datensätze generiert
|
|
4. ✅ Entity-Klasse mit automatischer Generierung erweitert
|
|
5. ✅ Repository-Methode `findByNoticeUrl()` hinzugefügt
|
|
|
|
## Hinweise
|
|
|
|
- Die URL wird **nur** generiert wenn `publication_id` vorhanden ist
|
|
- Führende Nullen werden automatisch entfernt (`00786665` → `786665`)
|
|
- Die URL wird bei jedem Update aktualisiert (falls sich `publication_id` ändert)
|
|
- Die Spalte ist **nicht** `NOT NULL` da alte Datensätze möglicherweise keine `publication_id` haben
|