docs: update CLAUDE.md with DLD award variants documentation
- Added filter support to DOK award type description - Added new section "Creating DLD Award Variants" with examples - Documented available filter operators and fields - Examples include DLD 80m, DLD CW, and DLD 80m CW Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
94
CLAUDE.md
94
CLAUDE.md
@@ -146,8 +146,10 @@ The award system is JSON-driven and located in `award-definitions/` directory. E
|
|||||||
2. **`dok`**: Count unique DOK (DARC Ortsverband Kennung) combinations
|
2. **`dok`**: Count unique DOK (DARC Ortsverband Kennung) combinations
|
||||||
- `target`: Number required
|
- `target`: Number required
|
||||||
- `confirmationType`: "dcl" (DARC Community Logbook)
|
- `confirmationType`: "dcl" (DARC Community Logbook)
|
||||||
|
- `filters`: Optional filters (band, mode, etc.) for award variants
|
||||||
- Counts unique (DOK, band, mode) combinations
|
- Counts unique (DOK, band, mode) combinations
|
||||||
- Only DCL-confirmed QSOs count
|
- Only DCL-confirmed QSOs count
|
||||||
|
- Example variants: DLD 80m, DLD CW, DLD 80m CW
|
||||||
|
|
||||||
3. **`points`**: Point-based awards
|
3. **`points`**: Point-based awards
|
||||||
- `stations`: Array of {callsign, points}
|
- `stations`: Array of {callsign, points}
|
||||||
@@ -202,6 +204,14 @@ The award system is JSON-driven and located in `award-definitions/` directory. E
|
|||||||
- `POST /api/dcl/sync`: Queue DCL sync job
|
- `POST /api/dcl/sync`: Queue DCL sync job
|
||||||
- `GET /api/jobs/:jobId`: Get job status
|
- `GET /api/jobs/:jobId`: Get job status
|
||||||
- `GET /api/jobs/active`: Get active job for current user
|
- `GET /api/jobs/active`: Get active job for current user
|
||||||
|
- `GET /*`: Serves static files from `src/frontend/build/` with SPA fallback
|
||||||
|
|
||||||
|
**SPA Routing**: The backend serves the SvelteKit frontend build from `src/frontend/build/`.
|
||||||
|
- Paths with file extensions (`.js`, `.css`, etc.) are served as static files
|
||||||
|
- Paths without extensions (e.g., `/qsos`, `/awards`) are served `index.html` for client-side routing
|
||||||
|
- Common missing files like `/favicon.ico` return 404 immediately
|
||||||
|
- If frontend build is missing entirely, returns a user-friendly 503 HTML page
|
||||||
|
- Prevents ugly Bun error pages when accessing client-side routes via curl or non-JS clients
|
||||||
|
|
||||||
**DCL Service**: `src/backend/services/dcl.service.js`
|
**DCL Service**: `src/backend/services/dcl.service.js`
|
||||||
- `fetchQSOsFromDCL(dclApiKey, sinceDate)`: Fetch from DCL API
|
- `fetchQSOsFromDCL(dclApiKey, sinceDate)`: Fetch from DCL API
|
||||||
@@ -277,6 +287,77 @@ To add a new award:
|
|||||||
6. Update documentation in `docs/DOCUMENTATION.md`
|
6. Update documentation in `docs/DOCUMENTATION.md`
|
||||||
7. Test with sample QSO data
|
7. Test with sample QSO data
|
||||||
|
|
||||||
|
### Creating DLD Award Variants
|
||||||
|
|
||||||
|
The DOK award type supports filters to create award variants. Examples:
|
||||||
|
|
||||||
|
**DLD on 80m** (`dld-80m.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": "dld-80m",
|
||||||
|
"name": "DLD 80m",
|
||||||
|
"description": "Confirm 100 unique DOKs on 80m",
|
||||||
|
"caption": "Contact 100 different DOKs on the 80m band.",
|
||||||
|
"category": "darc",
|
||||||
|
"rules": {
|
||||||
|
"type": "dok",
|
||||||
|
"target": 100,
|
||||||
|
"confirmationType": "dcl",
|
||||||
|
"displayField": "darcDok",
|
||||||
|
"filters": {
|
||||||
|
"operator": "AND",
|
||||||
|
"filters": [
|
||||||
|
{ "field": "band", "operator": "eq", "value": "80m" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**DLD in CW mode** (`dld-cw.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"rules": {
|
||||||
|
"type": "dok",
|
||||||
|
"target": 100,
|
||||||
|
"confirmationType": "dcl",
|
||||||
|
"filters": {
|
||||||
|
"operator": "AND",
|
||||||
|
"filters": [
|
||||||
|
{ "field": "mode", "operator": "eq", "value": "CW" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**DLD on 80m using CW** (combined filters, `dld-80m-cw.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"rules": {
|
||||||
|
"type": "dok",
|
||||||
|
"target": 100,
|
||||||
|
"confirmationType": "dcl",
|
||||||
|
"filters": {
|
||||||
|
"operator": "AND",
|
||||||
|
"filters": [
|
||||||
|
{ "field": "band", "operator": "eq", "value": "80m" },
|
||||||
|
{ "field": "mode", "operator": "eq", "value": "CW" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Available filter operators**:
|
||||||
|
- `eq`: equals
|
||||||
|
- `ne`: not equals
|
||||||
|
- `in`: in array
|
||||||
|
- `nin`: not in array
|
||||||
|
- `contains`: contains substring
|
||||||
|
|
||||||
|
**Available filter fields**: Any QSO field (band, mode, callsign, grid, state, satName, etc.)
|
||||||
|
|
||||||
### Confirmation Systems
|
### Confirmation Systems
|
||||||
|
|
||||||
- **LoTW (Logbook of The World)**: ARRL's confirmation system
|
- **LoTW (Logbook of The World)**: ARRL's confirmation system
|
||||||
@@ -316,11 +397,14 @@ Both LoTW and DCL return data in ADIF (Amateur Data Interchange Format):
|
|||||||
|
|
||||||
### Recent Commits
|
### Recent Commits
|
||||||
|
|
||||||
- **Uncommitted**: fix: logger debug level not working
|
- `7201446`: fix: return proper HTML for SPA routes instead of Bun error page
|
||||||
- Fixed bug where debug logs weren't showing due to falsy value handling
|
- When accessing client-side routes (like /qsos) via curl or non-JS clients,
|
||||||
- Changed `||` to `??` in logger config to properly handle log level 0 (debug)
|
the server attempted to open them as static files, causing Bun to throw
|
||||||
- Added `.env` file with `LOG_LEVEL=debug` for development
|
an unhandled ENOENT error that showed an ugly error page
|
||||||
- Debug logs now show DCL API request parameters with redacted API key
|
- Now checks if a path has a file extension before attempting to serve it
|
||||||
|
- Paths without extensions are immediately served index.html for SPA routing
|
||||||
|
- Also improves the 503 error page with user-friendly HTML when frontend build is missing
|
||||||
|
- `223461f`: fix: enable debug logging and improve DCL sync observability
|
||||||
- `27d2ef1`: fix: preserve DOK data when DCL doesn't send values
|
- `27d2ef1`: fix: preserve DOK data when DCL doesn't send values
|
||||||
- DCL sync only updates DOK/grid fields when DCL provides non-empty values
|
- DCL sync only updates DOK/grid fields when DCL provides non-empty values
|
||||||
- Prevents accidentally clearing DOK data from manual entry or other sources
|
- Prevents accidentally clearing DOK data from manual entry or other sources
|
||||||
|
|||||||
Reference in New Issue
Block a user