Files
pairgoth/doc/API.md
Claude Brisson 662f438cee Update documentation for API, configuration, and model
API.md:
- Add export formats (JSON, XML, EGF, FFG, CSV)
- Document /explain endpoint for pairing analysis
- Add PUT /standings for freezing
- Improve parameter documentation
- Fix typos (regitration -> registration, #tip -> #tid)

configuration.md:
- Add property loading hierarchy
- Document SSL/TLS configuration
- Add OAuth provider configuration
- Add ratings.path property
- Include example configurations

model.md:
- Complete entity diagram with Team, external IDs
- Document all tournament types (PAIRGO, RENGO, TEAM)
- Add TimeSystem types and parameters
- Document all pairing parameters
- List all 39 tiebreak criteria
- Add external database (AGA, EGF, FFG) documentation
2025-11-29 08:05:53 +01:00

287 lines
8.3 KiB
Markdown

# Pairgoth API specification
## General remarks
The API expects an `Accept` header of `application/json`, with no encoding or an `UTF-8` encoding. Exceptions are some export operations which can have different MIME types to specify the expected format:
- `application/json` - JSON output (default)
- `application/xml` - OpenGotha XML export
- `application/egf` - EGF format
- `application/ffg` - FFG format
- `text/csv` - CSV format
GET requests return either an array or an object, as specified below.
POST, PUT and DELETE requests return either the 200 HTTP code with `{ "success": true }` (with an optional `"id"` field for some POST requests), or an invalid HTTP code and (for some errors) the body `{ "success": false, "error": <error message> }`.
All POST/PUT/DELETE requests use read/write locks for concurrency. GET requests use read locks.
When authentication is enabled, all requests require an `Authorization` header.
## Synopsis
+ /api/tour GET POST Tournaments handling
+ /api/tour/#tid GET PUT DELETE Tournaments handling
+ /api/tour/#tid/part GET POST Registration handling
+ /api/tour/#tid/part/#pid GET PUT DELETE Registration handling
+ /api/tour/#tid/team GET POST Team handling
+ /api/tour/#tid/team/#tid GET PUT DELETE Team handling
+ /api/tour/#tid/pair/#rn GET POST PUT DELETE Pairing
+ /api/tour/#tid/res/#rn GET PUT DELETE Results
+ /api/tour/#tid/standings GET PUT Standings
+ /api/tour/#tid/stand/#rn GET Standings
+ /api/tour/#tid/explain/#rn GET Pairing explanation
+ /api/token GET POST DELETE Authentication
## Tournament handling
+ `GET /api/tour` Get a list of known tournaments ids
*output* json map (id towards shortName) of known tournaments
+ `GET /api/tour/#tid` Get the details of tournament #tid
*output* json object for tournament #tid
Supports `Accept: application/xml` to get OpenGotha XML export.
+ `POST /api/tour` Create a new tournament
*input* json object for new tournament, or OpenGotha XML with `Content-Type: application/xml`
Tournament JSON structure:
```json
{
"type": "INDIVIDUAL",
"name": "Tournament Name",
"shortName": "TN",
"startDate": "2024-01-15",
"endDate": "2024-01-16",
"country": "fr",
"location": "Paris",
"online": false,
"rounds": 5,
"gobanSize": 19,
"rules": "FRENCH",
"komi": 7.5,
"timeSystem": { ... },
"pairing": { ... }
}
```
Tournament types: `INDIVIDUAL`, `PAIRGO`, `RENGO2`, `RENGO3`, `TEAM2`, `TEAM3`, `TEAM4`, `TEAM5`
*output* `{ "success": true, "id": #tid }`
+ `PUT /api/tour/#tid` Modify a tournament
*input* json object for updated tournament (only id and updated fields required)
*output* `{ "success": true }`
+ `DELETE /api/tour/#tid` Delete a tournament
*output* `{ "success": true }`
## Players handling
+ `GET /api/tour/#tid/part` Get a list of registered players
*output* json array of known players
+ `GET /api/tour/#tid/part/#pid` Get registration details for player #pid
*output* json object for player #pid
+ `POST /api/tour/#tid/part` Register a new player
*input*
```json
{
"name": "Lastname",
"firstname": "Firstname",
"rating": 1500,
"rank": -5,
"country": "FR",
"club": "Club Name",
"final": true,
"mmsCorrection": 0,
"egfId": "12345678",
"ffgId": "12345",
"agaId": "12345"
}
```
Rank values: -30 (30k) to 8 (9D). Rating in EGF-style (100 = 1 stone).
*output* `{ "success": true, "id": #pid }`
+ `PUT /api/tour/#tid/part/#pid` Modify a player registration
*input* json object for updated registration (only id and updated fields required)
*output* `{ "success": true }`
+ `DELETE /api/tour/#tid/part/#pid` Delete a player registration
*output* `{ "success": true }`
## Teams handling
For team tournaments (PAIRGO, RENGO2, RENGO3, TEAM2-5).
+ `GET /api/tour/#tid/team` Get a list of registered teams
*output* json array of known teams
+ `GET /api/tour/#tid/team/#teamid` Get registration details for team #teamid
*output* json object for team #teamid
+ `POST /api/tour/#tid/team` Register a new team
*input*
```json
{
"name": "Team Name",
"playerIds": [1, 2, 3],
"final": true,
"mmsCorrection": 0
}
```
*output* `{ "success": true, "id": #teamid }`
+ `PUT /api/tour/#tid/team/#teamid` Modify a team registration
*input* json object for updated registration (only id and updated fields required)
*output* `{ "success": true }`
+ `DELETE /api/tour/#tid/team/#teamid` Delete a team registration
*output* `{ "success": true }`
## Pairing
+ `GET /api/tour/#tid/pair/#rn` Get pairable players for round #rn
*output*
```json
{
"games": [ { "id": 1, "t": 1, "w": 2, "b": 3, "h": 0 }, ... ],
"pairables": [ 4, 5, ... ],
"unpairables": [ 6, 7, ... ]
}
```
- `games`: existing pairings for the round
- `pairables`: player IDs available for pairing (not skipping, not already paired)
- `unpairables`: player IDs skipping the round
+ `POST /api/tour/#tid/pair/#rn` Generate pairing for round #rn
*input* `[ "all" ]` or `[ #pid, ... ]`
Optional query parameters:
- `legacy=true` - Use legacy pairing algorithm
- `weights_output=<file>` - Output weights to file for debugging
- `append=true` - Append to weights output file
*output* `[ { "id": #gid, "t": table, "w": #wpid, "b": #bpid, "h": handicap }, ... ]`
+ `PUT /api/tour/#tid/pair/#rn` Manual pairing or table renumbering
For manual pairing:
*input* `{ "id": #gid, "w": #wpid, "b": #bpid, "h": <handicap> }`
For table renumbering:
*input* `{ "renumber": <game_id or null>, "orderBy": "mms" | "table" }`
*output* `{ "success": true }`
+ `DELETE /api/tour/#tid/pair/#rn` Delete pairing for round #rn
*input* `[ "all" ]` or `[ #gid, ... ]`
Games with results already entered are skipped unless `"all"` is specified.
*output* `{ "success": true }`
## Results
+ `GET /api/tour/#tid/res/#rn` Get results for round #rn
*output* `[ { "id": #gid, "res": <result> }, ... ]`
Result codes:
- `"w"` - White won
- `"b"` - Black won
- `"="` - Jigo (draw)
- `"X"` - Cancelled
- `"?"` - Unknown (not yet played)
- `"#"` - Both win (unusual)
- `"0"` - Both lose (unusual)
+ `PUT /api/tour/#tid/res/#rn` Save a result
*input* `{ "id": #gid, "res": <result> }`
*output* `{ "success": true }`
+ `DELETE /api/tour/#tid/res/#rn` Clear all results for round
*output* `{ "success": true }`
## Standings
+ `GET /api/tour/#tid/standings` Get standings after final round
*output* `[ { "id": #pid, "place": place, "<crit>": value }, ... ]`
Supports multiple output formats via Accept header:
- `application/json` - JSON (default)
- `application/egf` - EGF format
- `application/ffg` - FFG format
- `text/csv` - CSV format
Optional query parameters:
- `include_preliminary=true` - Include preliminary standings
- `individual_standings=true` - For team tournaments with individual scoring
+ `GET /api/tour/#tid/stand/#rn` Get standings after round #rn
Use round `0` for initial standings.
*output* `[ { "id": #pid, "place": place, "<crit>": value }, ... ]`
Criteria names include: `nbw`, `mms`, `sts`, `cps`, `sosw`, `sosm`, `sososw`, `sososm`, `sodosw`, `sodosm`, `cussw`, `cussm`, `dc`, `sdc`, `ext`, `exr`, etc.
+ `PUT /api/tour/#tid/standings` Freeze/lock standings
*output* `{ "success": true }`
## Pairing explanation
+ `GET /api/tour/#tid/explain/#rn` Get detailed pairing criteria weights for round #rn
*output* Detailed pairing weight analysis and criteria breakdown
Used for debugging and understanding pairing decisions.
## Authentication
+ `GET /api/token` Check authentication status
*output* Token information for the currently logged user, or error if not authenticated.
+ `POST /api/token` Create an access token
*input* Authentication credentials (format depends on auth mode)
*output* `{ "success": true, "token": "..." }`
+ `DELETE /api/token` Logout / revoke token
*output* `{ "success": true }`