Compare commits
164 Commits
core-0.24.0
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| db9d153391 | |||
| 55f102cbaa | |||
| d66b6fa471 | |||
| 676e4110c0 | |||
| 0ad2e10999 | |||
| 225c2285b7 | |||
| c5661de4a0 | |||
| 3b6c5297f6 | |||
| a24924c230 | |||
| 11826356c1 | |||
| e18b1df744 | |||
| 595c172900 | |||
| cf225826c0 | |||
| 25c05bc2d8 | |||
| 4ec6295d1d | |||
| 2d18478110 | |||
| 8b95f10c65 | |||
| f3d96fd700 | |||
| 4762f6c0c3 | |||
| 7117a93376 | |||
| 085e34f062 | |||
| 32c388760b | |||
| 98b0bba398 | |||
| 9836e87392 | |||
| 2579539084 | |||
| bc500e3e94 | |||
| 2dbb1d0b67 | |||
| 252851de1c | |||
| a253fa78df | |||
| ae3ef766e8 | |||
| 487711628f | |||
| 008d72d826 | |||
| 576e3fea9b | |||
| 1f66b7bde7 | |||
| 381161f003 | |||
| d0150fdfa4 | |||
| 29072efbfb | |||
| dcc5ce1195 | |||
| 354db11972 | |||
| 9296db88b7 | |||
| ec22a9585e | |||
| 411eed2453 | |||
| af6b0ed8b7 | |||
| bcd8257db2 | |||
| d61fe97b4c | |||
| 959bb53335 | |||
| b610678005 | |||
| d0552b08b5 | |||
| 87f29a7204 | |||
| cb44f491bd | |||
| f5614c3582 | |||
| 9d960d3ee5 | |||
| a9f4606b40 | |||
| 32a12737e3 | |||
| b4c75e2a0f | |||
| 9bf995f47d | |||
| 8df418627c | |||
| 6dbe1e62ac | |||
| 6311d8fd00 | |||
| 5205468534 | |||
| 4ec5b931de | |||
| ebba729af3 | |||
| 5619c8223a | |||
| 2d76c001fe | |||
| b58bbbc782 | |||
| 1a02f9e186 | |||
| 255f43ddda | |||
| f109fe3860 | |||
| a07bf89fae | |||
| b47ad7ef89 | |||
| 2e4ba43597 | |||
| b0d27d2de2 | |||
| 8f9eb12f66 | |||
| 5d5fffa812 | |||
| 73239088d9 | |||
| 4ad92ab236 | |||
| c65a1393b9 | |||
| 4a36096a55 | |||
| 960a419792 | |||
| 68d6c1d36f | |||
| b991878214 | |||
| 43525d41a3 | |||
| 6bf1013710 | |||
| 255e2da33c | |||
| 4b3b5e7c4e | |||
| 1d121c727c | |||
| 56f0030a83 | |||
| d0c71693bb | |||
| 3f12f695f1 | |||
| 0a3c494fa8 | |||
| f7ce4df595 | |||
| d41c03700c | |||
| 10937e756a | |||
| 380a2cceeb | |||
| 43184d296d | |||
| 67802ee1b8 | |||
| 3ed3e59ee4 | |||
| 0060229ee9 | |||
| d5c8da20f8 | |||
| ad9495afa3 | |||
| 2b04d7fa71 | |||
| 81b045d01b | |||
| 118acff0e5 | |||
| a49f9be146 | |||
| 2a5cfeee39 | |||
| 72ce262bc4 | |||
| a298417b9e | |||
| 3870566349 | |||
| 5f177e1415 | |||
| 760859d066 | |||
| 04edd4d6fd | |||
| e81c3844ad | |||
| 3904d5ad8a | |||
| 58e08f3807 | |||
| 8ded402a0e | |||
| d438e97f32 | |||
| fcc251f777 | |||
| 7efdd69948 | |||
| 9459203e0d | |||
| d57c488661 | |||
| 989ac312d9 | |||
| c96a09bb5c | |||
| e9a4ecf4ae | |||
| 87dfc6c2bc | |||
| 183ad670e3 | |||
| 649566eb3f | |||
| 6844253f4c | |||
| be0b710543 | |||
| dcebdf237e | |||
| 0f41f13ce6 | |||
| ae6d235e1d | |||
| b4920d3817 | |||
| 708ebaf6e5 | |||
| 0eb752d493 | |||
| e279c39246 | |||
| a101866bcf | |||
| 5baf6a7cdb | |||
| a10958b0d1 | |||
| dc224abe26 | |||
| 1813ea1d2d | |||
| 6e0fd9523e | |||
| 847b13202c | |||
| c08d5303eb | |||
| 33e5017f51 | |||
| de391113dc | |||
| 85b187293f | |||
| 4a145cb538 | |||
| 327c23a6aa | |||
| d522f7f6ed | |||
| 82d0b754be | |||
| 4694f516fa | |||
| fa3c6b2886 | |||
| e472fb75ad | |||
| 5f44570b35 | |||
| c16f139c8e | |||
| cabf1bca73 | |||
| 0c981517da | |||
| 18a4b1cc15 | |||
| 804a4bf179 | |||
| 3c47d2b8c9 | |||
| d346c41d98 | |||
| 2dd0501687 | |||
| e17e4e806a | |||
| 9f86cc421f |
@@ -0,0 +1,88 @@
|
|||||||
|
# Create Defect in YouTrack
|
||||||
|
|
||||||
|
Automated defect creation workflow. Topic/hint: `$ARGUMENTS`
|
||||||
|
|
||||||
|
## Step 1 — Gather Context
|
||||||
|
|
||||||
|
Use `AskUserQuestion` tool to ask the user (max 4 questions at once):
|
||||||
|
|
||||||
|
1. **Component** — Where does the bug occur? (e.g. move generation, FEN parsing, castling, UI, API)
|
||||||
|
2. **What breaks** — What is the actual (broken) behavior?
|
||||||
|
3. **Expected** — What should happen instead?
|
||||||
|
4. **Reproducibility** — Is it always reproducible? Any known trigger conditions?
|
||||||
|
|
||||||
|
If `$ARGUMENTS` already answers some of these, skip those questions.
|
||||||
|
|
||||||
|
## Step 2 — Research (if needed)
|
||||||
|
|
||||||
|
If the bug involves domain logic or rules:
|
||||||
|
- Search repo for relevant code (`Grep`/`Bash`).
|
||||||
|
- Check test files for existing coverage of the broken area.
|
||||||
|
- Do NOT guess at root cause. Surface findings before drafting.
|
||||||
|
|
||||||
|
## Step 3 — Draft Defect
|
||||||
|
|
||||||
|
Compose the full defect report using this template:
|
||||||
|
|
||||||
|
```
|
||||||
|
Summary
|
||||||
|
|
||||||
|
[One-sentence description of what is broken.]
|
||||||
|
|
||||||
|
|
||||||
|
Steps to Reproduce
|
||||||
|
|
||||||
|
1. Step one
|
||||||
|
2. Step two
|
||||||
|
3. Step three
|
||||||
|
|
||||||
|
|
||||||
|
Expected Behavior
|
||||||
|
|
||||||
|
[What should happen.]
|
||||||
|
|
||||||
|
|
||||||
|
Actual Behavior
|
||||||
|
|
||||||
|
[What actually happens.]
|
||||||
|
|
||||||
|
|
||||||
|
Environment / Notes
|
||||||
|
|
||||||
|
[Any relevant context: FEN positions, game conditions, config, browser, OS — only if applicable.]
|
||||||
|
```
|
||||||
|
|
||||||
|
Rules:
|
||||||
|
- Steps must be minimal and reproducible.
|
||||||
|
- Expected vs actual: concrete and unambiguous.
|
||||||
|
- Omit "Environment / Notes" section if not relevant.
|
||||||
|
|
||||||
|
## Step 4 — Clarify
|
||||||
|
|
||||||
|
Show the draft to the user.
|
||||||
|
**Use `AskUserQuestion` tool to ask:**
|
||||||
|
- Are steps to reproduce complete and accurate?
|
||||||
|
- Severity: Blocker / Critical / Major / Minor / Trivial?
|
||||||
|
- Any related tickets or recent changes to link?
|
||||||
|
|
||||||
|
Incorporate feedback. Repeat until user approves.
|
||||||
|
|
||||||
|
## Step 5 — Determine Project
|
||||||
|
|
||||||
|
- Frontend / UI / UX → project: `NCWF`
|
||||||
|
- Backend / coordinator / systems / bot / engine → project: `NCS`
|
||||||
|
|
||||||
|
If ambiguous, ask the user.
|
||||||
|
|
||||||
|
## Step 6 — Create Issue
|
||||||
|
|
||||||
|
Call `mcp__youtrack__create_issue` with:
|
||||||
|
- `project`: determined in Step 5
|
||||||
|
- `summary`: concise title describing what is broken (≤72 chars, sentence case)
|
||||||
|
- `description`: full formatted defect report from Step 3 (Markdown)
|
||||||
|
- `type`: `Bug`
|
||||||
|
|
||||||
|
## Step 7 — Report
|
||||||
|
|
||||||
|
Display the created issue ID and URL.
|
||||||
|
Ask if a linked investigation or fix task is needed.
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
# Create User Story in YouTrack
|
||||||
|
|
||||||
|
Automated user-story creation workflow. Topic/hint: `$ARGUMENTS`
|
||||||
|
|
||||||
|
## Step 1 — Gather Context
|
||||||
|
|
||||||
|
Use `AskUserQuestion` tool to ask the user (max 4 questions at once):
|
||||||
|
|
||||||
|
1. **Domain** — Is this frontend (UI/UX) or backend/coordinator/systems work?
|
||||||
|
2. **User type** — Who is the actor? (e.g. player, admin, bot, system)
|
||||||
|
3. **Action** — What should the user be able to do?
|
||||||
|
4. **Goal/value** — Why? What outcome does it enable?
|
||||||
|
|
||||||
|
If `$ARGUMENTS` already answers some of these, skip those questions.
|
||||||
|
|
||||||
|
## Step 2 — Research (if needed)
|
||||||
|
|
||||||
|
If the topic involves unfamiliar domain logic, game rules, or technical constraints:
|
||||||
|
- Search the repo for relevant code (use `Grep`/`Bash` to find related files).
|
||||||
|
- Use `WebSearch` if the topic involves external standards or protocols.
|
||||||
|
- Do NOT guess. Surface findings before drafting.
|
||||||
|
|
||||||
|
## Step 3 — Draft Story
|
||||||
|
|
||||||
|
Compose the full story using this template:
|
||||||
|
|
||||||
|
```
|
||||||
|
As a [type of user]
|
||||||
|
I want to [perform an action]
|
||||||
|
So that [achieve a goal or value]
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
|
||||||
|
[Additional context or business logic for this story.]
|
||||||
|
|
||||||
|
|
||||||
|
Acceptance Criteria
|
||||||
|
|
||||||
|
[List the specific, measurable criteria that define when this story is done:]
|
||||||
|
|
||||||
|
- Criterion 1
|
||||||
|
- Criterion 2
|
||||||
|
- Criterion 3
|
||||||
|
|
||||||
|
|
||||||
|
Implementation Notes
|
||||||
|
|
||||||
|
[Technical notes, design references, or constraints.]
|
||||||
|
```
|
||||||
|
|
||||||
|
Rules:
|
||||||
|
- User story line: plain English, present tense, from user's perspective.
|
||||||
|
- Acceptance criteria: testable, unambiguous, one condition each.
|
||||||
|
- Implementation notes: optional — only include if there are known constraints, related tickets, or design refs.
|
||||||
|
|
||||||
|
## Step 4 — Clarify Acceptance Criteria
|
||||||
|
|
||||||
|
Show the draft to the user.
|
||||||
|
**Use `AskUserQuestion` tool to ask:**
|
||||||
|
- Are the acceptance criteria complete and correct?
|
||||||
|
- Any implementation constraints to add?
|
||||||
|
- Priority (if known)?
|
||||||
|
|
||||||
|
Incorporate feedback. Repeat until user approves.
|
||||||
|
|
||||||
|
## Step 5 — Determine Project
|
||||||
|
|
||||||
|
> **Project routing rules (always apply these):**
|
||||||
|
> - Backend code (game engine, bots, API, services, coordinator) → `NCS`
|
||||||
|
> - Frontend code (UI, UX, web app) → `NCWF`
|
||||||
|
> - Infrastructure (Kubernetes, pipelines, CI/CD, DB setup, cloud infra) → `NCI`
|
||||||
|
> - If ambiguous, ask the user.
|
||||||
|
|
||||||
|
- Frontend / UI / UX → project: `NCWF`
|
||||||
|
- Backend / coordinator / systems / bot / engine → project: `NCS`
|
||||||
|
- Kubernetes, pipelines, CI/CD, DB setup, infrastructure → project: `NCI`
|
||||||
|
|
||||||
|
If still ambiguous, ask the user.
|
||||||
|
|
||||||
|
## Step 6 — Create Issue
|
||||||
|
|
||||||
|
Call `mcp__youtrack__create_issue` with:
|
||||||
|
- `project`: determined in Step 5
|
||||||
|
- `summary`: concise title derived from the "I want to" clause (≤72 chars, sentence case)
|
||||||
|
- `description`: full formatted story from Step 3 (Markdown)
|
||||||
|
- `type`: `Feature` (or `Task` if purely technical with no user-facing value)
|
||||||
|
|
||||||
|
## Step 7 — Link Issues
|
||||||
|
|
||||||
|
After creation, **automatically** ask the user (use `AskUserQuestion` if interactive, otherwise infer from context):
|
||||||
|
|
||||||
|
> Are there related issues to link? (skip if none)
|
||||||
|
|
||||||
|
Collect any issue IDs the user mentions. For each, determine the correct relation and call `mcp__youtrack__link_issues`:
|
||||||
|
|
||||||
|
| Situation | Relation to use |
|
||||||
|
|-----------|----------------|
|
||||||
|
| This story must be done before another | `blocks` |
|
||||||
|
| Another story must be done before this | `is blocked by` |
|
||||||
|
| Stories share domain or are related | `relates to` |
|
||||||
|
| This is a child of an epic/story | `subtask of` |
|
||||||
|
| This is a parent grouping subtasks | `parent for` |
|
||||||
|
| This depends on another ticket's output | `depends on` |
|
||||||
|
|
||||||
|
If the user mentions an issue in the story description or implementation notes (e.g. "see NCS-42", "after NCS-12 is done"), auto-detect and suggest linking it — confirm before creating the link.
|
||||||
|
|
||||||
|
## Step 8 — Report
|
||||||
|
|
||||||
|
Display the created issue ID and URL.
|
||||||
|
List any links created (relation type + linked issue ID).
|
||||||
|
Ask if a linked sub-task or implementation ticket is needed.
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# Estimate Issue Time in YouTrack
|
||||||
|
|
||||||
|
Sprint planning time estimator. Issue ID or empty for full current sprint: `$ARGUMENTS`
|
||||||
|
|
||||||
|
## Step 1 — Determine Scope
|
||||||
|
|
||||||
|
**Single-issue mode** (`$ARGUMENTS` set):
|
||||||
|
- Call `mcp__youtrack__get_issue` on `$ARGUMENTS`.
|
||||||
|
- Proceed with that issue only.
|
||||||
|
|
||||||
|
**Sprint mode** (`$ARGUMENTS` empty):
|
||||||
|
- Call `mcp__youtrack__search_issues` with query `project: NCS Sprints: {current sprint} #Unresolved`.
|
||||||
|
- If query returns 0 results, use `AskUserQuestion` to ask for the sprint name, then retry with `project: NCS Sprints: {name}`.
|
||||||
|
- Collect all returned issues.
|
||||||
|
|
||||||
|
## Step 2 — Build Issue Tree
|
||||||
|
|
||||||
|
For each top-level issue from Step 1:
|
||||||
|
1. Fetch full details via `mcp__youtrack__get_issue`: summary, description, acceptance criteria, Type, existing `Zeitschätzung`, linked issues.
|
||||||
|
2. Identify subtasks from links with relation `subtask of` (i.e. issues where the fetched issue is the parent).
|
||||||
|
3. Recursively fetch subtasks until all leaves are known.
|
||||||
|
4. Group into tree: Epic → Story → Task/Subtask.
|
||||||
|
|
||||||
|
**Leaf node** = issue with no subtask children.
|
||||||
|
**Parent node** = issue that has at least one subtask child.
|
||||||
|
|
||||||
|
## Step 3 — Estimate Leaf Nodes
|
||||||
|
|
||||||
|
For each leaf node:
|
||||||
|
1. Read: summary, description, acceptance criteria, implementation notes.
|
||||||
|
2. If scope is unclear, search codebase (`Grep`/`Bash`) for related files to gauge complexity.
|
||||||
|
3. Assign estimate using this scale:
|
||||||
|
|
||||||
|
| Size | Criteria | Estimate |
|
||||||
|
|------|----------|----------|
|
||||||
|
| Trivial | Config change, rename, 1-file tweak | 30m |
|
||||||
|
| Small | 1–3 files, clear scope, no unknowns | 1h–2h |
|
||||||
|
| Medium | 3–6 files, some design needed | 3h–5h |
|
||||||
|
| Large | 6+ files, cross-module, non-trivial design | 1d–2d |
|
||||||
|
| XL | New subsystem, research spike, major refactor | 3d–5d |
|
||||||
|
|
||||||
|
4. Record: estimate + one-line reasoning.
|
||||||
|
5. Skip leaf if it already has `Zeitschätzung` set — note it as pre-estimated.
|
||||||
|
|
||||||
|
## Step 4 — Roll Up for Display
|
||||||
|
|
||||||
|
YouTrack auto-sums `Zeitschätzung` from subtasks up to parents — **do not write estimates to parent nodes**.
|
||||||
|
|
||||||
|
Compute display-only rolled-up totals:
|
||||||
|
- Parent total = sum of all descendant leaf estimates (including pre-estimated ones).
|
||||||
|
- Flag any branch where some leaves are missing estimates (partial roll-up).
|
||||||
|
|
||||||
|
## Step 5 — Show Summary + Confirm
|
||||||
|
|
||||||
|
Display full tree with estimates. Format:
|
||||||
|
|
||||||
|
```
|
||||||
|
Epic NCS-10: Castling overhaul [4h 30m] ← rolled up
|
||||||
|
Story NCS-11: Validate castling rights [2h 30m] ← rolled up
|
||||||
|
Task NCS-12: Fix RuleSet check 1h 30m ← leaf (new)
|
||||||
|
Task NCS-13: Add regression tests 1h ← leaf (new)
|
||||||
|
Story NCS-14: UI feedback for castling [2h] ← rolled up
|
||||||
|
Task NCS-15: Highlight invalid squares 2h ← leaf (pre-set, skipped)
|
||||||
|
```
|
||||||
|
|
||||||
|
Legend: `[X]` = display-only roll-up (not written). Plain = will be written to YouTrack.
|
||||||
|
|
||||||
|
If sprint mode, show grand total at bottom:
|
||||||
|
```
|
||||||
|
Sprint total: Xd Yh Zm (N issues, M leaves to update)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use `AskUserQuestion` tool:**
|
||||||
|
- Does the breakdown look right?
|
||||||
|
- Any estimates to adjust before writing to YouTrack?
|
||||||
|
|
||||||
|
Incorporate all feedback before proceeding.
|
||||||
|
|
||||||
|
## Step 6 — Write Estimates
|
||||||
|
|
||||||
|
On user approval, write estimates **only to leaf nodes** (bottom-up order):
|
||||||
|
- For each leaf with a new estimate, call `mcp__youtrack__update_issue` with field `Zeitschätzung` = approved estimate.
|
||||||
|
- YouTrack period format: `"30m"`, `"1h 30m"`, `"1d"`, `"2d 4h"`.
|
||||||
|
- Skip leaves already pre-estimated.
|
||||||
|
|
||||||
|
## Step 7 — Report
|
||||||
|
|
||||||
|
List all updated issues with set estimates.
|
||||||
|
Show final rolled-up totals per Epic/Story (read back from YouTrack via `mcp__youtrack__get_issue` if needed).
|
||||||
|
In sprint mode, show total sprint estimate.
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
# Fix Defect from YouTrack
|
||||||
|
|
||||||
|
Automated defect-fix workflow. Ticket ID: `$ARGUMENTS`
|
||||||
|
|
||||||
|
## Step 1 — Fetch Ticket
|
||||||
|
|
||||||
|
Call `mcp__youtrack__get_issue` with ID `$ARGUMENTS`.
|
||||||
|
Extract and display: summary, description, steps to reproduce, Priority, Subsystem.
|
||||||
|
|
||||||
|
## Step 2 — Create Worktree
|
||||||
|
|
||||||
|
Derive branch name from ticket:
|
||||||
|
- `type` from YouTrack issue type: `bug` → `fix`, `feature`/`task` → `feat`, `refactor` → `refactor`, else `chore`
|
||||||
|
- `scope` from affected module/component (kebab-case, omit if unclear)
|
||||||
|
- `description` from ticket summary: lowercase, kebab-case, max 40 chars, drop articles
|
||||||
|
|
||||||
|
Branch format: `<type>/<ticket-id>-<description>`
|
||||||
|
Example: `fix/NOW-123-castling-validation-failure`
|
||||||
|
|
||||||
|
Call `EnterWorktree` with that branch name.
|
||||||
|
All subsequent file work happens inside this worktree.
|
||||||
|
|
||||||
|
## Step 3 — Identify Root Cause (read-only)
|
||||||
|
|
||||||
|
1. Run `./compile` — capture all errors and warnings.
|
||||||
|
2. Run `./test` — capture all failures.
|
||||||
|
3. Spawn `cavecrew-investigator` with: ticket description + compile/test output → locate root cause (files, line numbers, what's wrong).
|
||||||
|
4. **If anything is ambiguous (reproduction unclear, scope uncertain, conflicting signals), use `AskUserQuestion` tool to ask — max 4 questions at once.**
|
||||||
|
5. **Report findings to user. No file writes yet. Wait for acknowledgement before continuing.**
|
||||||
|
|
||||||
|
## Step 3b — Complexity Assessment + Subtasks
|
||||||
|
|
||||||
|
After root cause confirmed, assess scope:
|
||||||
|
|
||||||
|
**Simple** (1–2 files, single concern, < 1 hour estimated): proceed directly to Step 4.
|
||||||
|
|
||||||
|
**Complex** (3+ files, multiple concerns, or estimated > 1 hour): create subtasks before coding.
|
||||||
|
|
||||||
|
To create subtasks:
|
||||||
|
1. Break fix into discrete, independently-completable tasks (e.g. "Fix validation in RuleSet", "Add regression test for castling edge case", "Update FenParser to handle X").
|
||||||
|
2. For each subtask call `mcp__youtrack__create_issue` with:
|
||||||
|
- `project`: based on subtask content — do **not** inherit from parent. Backend code → `NCS`; frontend/UI → `NCWF`; Kubernetes/pipelines/CI-CD/DB setup/infrastructure → `NCI`. If ambiguous, ask user.
|
||||||
|
- `summary`: concise action-oriented title
|
||||||
|
- `type`: `Task`
|
||||||
|
- `description`: what to do and why
|
||||||
|
3. Call `mcp__youtrack__link_issues` to link each subtask to `$ARGUMENTS` with relation `subtask of`.
|
||||||
|
4. Check if the ticket description or comments mention other issue IDs. For each mentioned ID, suggest a link and confirm with user:
|
||||||
|
- Fix depends on another fix finishing first → `is blocked by`
|
||||||
|
- This fix blocks another ticket → `blocks`
|
||||||
|
- Logically related but independent → `relates to`
|
||||||
|
5. List created subtask IDs and any additional links to user.
|
||||||
|
|
||||||
|
Then proceed to Step 4, implementing subtasks in order.
|
||||||
|
|
||||||
|
## Step 4 — Fix
|
||||||
|
|
||||||
|
1. Implement fix (use `scala-implementer` agent for non-trivial changes; inline edits for small ones).
|
||||||
|
2. Run `./compile` — must be green.
|
||||||
|
3. Run `./test` — must be green.
|
||||||
|
4. Run `./gradlew spotlessScalaApply` — **blocking, foreground only**. Wait for completion before continuing.
|
||||||
|
5. Run `./lint` — **blocking, foreground only** (never `run_in_background`). Wait for exit code 0. Must be green.
|
||||||
|
- If lint fails, fix all issues and re-run until exit code 0.
|
||||||
|
- **Do NOT proceed to Step 5 until `./lint` has completed and returned exit code 0.**
|
||||||
|
If any step fails, iterate until all pass.
|
||||||
|
|
||||||
|
## Step 5 — Review
|
||||||
|
|
||||||
|
Spawn `cavecrew-reviewer` on the full diff.
|
||||||
|
Display findings grouped by severity.
|
||||||
|
|
||||||
|
## Step 5b — Apply Review Findings
|
||||||
|
|
||||||
|
If the review produced any findings (any severity):
|
||||||
|
1. Implement all agreed fixes.
|
||||||
|
2. Run `./compile` — must be green.
|
||||||
|
3. Run `./test` — must be green.
|
||||||
|
4. Run `./gradlew spotlessScalaApply` — **blocking, foreground only**. Wait for completion.
|
||||||
|
5. Run `./lint` — **blocking, foreground only**. Wait for exit code 0.
|
||||||
|
- If lint fails, fix all issues and re-run until exit code 0.
|
||||||
|
6. Re-spawn `cavecrew-reviewer` on the updated diff to confirm all findings are resolved.
|
||||||
|
|
||||||
|
Repeat until review is clean or user explicitly accepts remaining findings.
|
||||||
|
|
||||||
|
## Step 6 — Confirm + Push
|
||||||
|
|
||||||
|
Show summary: ticket, branch, files changed, review findings.
|
||||||
|
**Use `AskUserQuestion` tool to ask for explicit approval before pushing.** Include any open questions about commit message scope or body if unclear.
|
||||||
|
|
||||||
|
On approval, commit following Conventional Commits:
|
||||||
|
|
||||||
|
```
|
||||||
|
<type>(<scope>): <short description, imperative, ≤50 chars>
|
||||||
|
|
||||||
|
<optional body: what changed and why, wrap at 72 chars>
|
||||||
|
|
||||||
|
Closes $ARGUMENTS
|
||||||
|
https://knockoutwhist.youtrack.cloud/issue/$ARGUMENTS
|
||||||
|
```
|
||||||
|
|
||||||
|
- `type`: same as branch type (`fix`, `feat`, `refactor`, `chore`, etc.)
|
||||||
|
- `scope`: affected module (`core`, `rule`, `api`, `bot`, `io`)
|
||||||
|
- Subject: imperative mood, no period, lowercase
|
||||||
|
- Footer `Closes $ARGUMENTS` and ticket URL always present
|
||||||
|
|
||||||
|
Push branch to remote.
|
||||||
|
|
||||||
|
## Step 7 — Comment on Ticket
|
||||||
|
|
||||||
|
After successful push, call `mcp__youtrack__add_issue_comment` on `$ARGUMENTS` with:
|
||||||
|
|
||||||
|
```
|
||||||
|
Branch `<branch-name>` pushed.
|
||||||
|
|
||||||
|
<one-sentence summary of what was changed and why>
|
||||||
|
|
||||||
|
Files changed:
|
||||||
|
- <file1>
|
||||||
|
- <file2>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 7b — Additional Links
|
||||||
|
|
||||||
|
After commenting, ask the user if `$ARGUMENTS` should be linked to any other issues not already linked:
|
||||||
|
|
||||||
|
| Situation | Relation |
|
||||||
|
|-----------|---------|
|
||||||
|
| This fix blocks another open ticket | `blocks` |
|
||||||
|
| Another ticket must ship first | `is blocked by` |
|
||||||
|
| Related defect or story | `relates to` |
|
||||||
|
| Duplicate of another defect | `duplicates` |
|
||||||
|
|
||||||
|
Scan the ticket description and comments for any issue IDs that were mentioned but not yet linked. Suggest those automatically.
|
||||||
|
|
||||||
|
Call `mcp__youtrack__link_issues` for each confirmed link.
|
||||||
|
|
||||||
|
## Step 8 — Cleanup
|
||||||
|
|
||||||
|
Call `ExitWorktree` with `discard_changes: true` to delete the worktree.
|
||||||
|
(Branch was pushed in step 6 — commits are safe on remote; `discard_changes: true` bypasses the local-ahead guard.)
|
||||||
|
Report: branch pushed, ticket commented, links created, worktree deleted, done.
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
# Implement Feature from YouTrack
|
||||||
|
|
||||||
|
Automated feature-implementation workflow. Ticket ID: `$ARGUMENTS`
|
||||||
|
|
||||||
|
## Step 1 — Fetch Ticket
|
||||||
|
|
||||||
|
Call `mcp__youtrack__get_issue` with ID `$ARGUMENTS`.
|
||||||
|
Extract and display: summary, description, acceptance criteria, Priority, Subsystem.
|
||||||
|
|
||||||
|
## Step 2 — Create Worktree
|
||||||
|
|
||||||
|
Derive branch name from ticket:
|
||||||
|
- `type` from YouTrack issue type: `feature`/`task` → `feat`, `refactor` → `refactor`, `bug` → `fix`, else `chore`
|
||||||
|
- `scope` from affected module/component (kebab-case, omit if unclear)
|
||||||
|
- `description` from ticket summary: lowercase, kebab-case, max 40 chars, drop articles
|
||||||
|
|
||||||
|
Branch format: `<type>/<ticket-id>-<description>`
|
||||||
|
Example: `feat/NOW-456-add-bot-difficulty-slider`
|
||||||
|
|
||||||
|
Call `EnterWorktree` with that branch name.
|
||||||
|
All subsequent file work happens inside this worktree.
|
||||||
|
|
||||||
|
## Step 3 — Understand Requirements (read-only)
|
||||||
|
|
||||||
|
1. Run `./compile` — confirm baseline is green.
|
||||||
|
2. Run `./test` — confirm baseline is green.
|
||||||
|
3. Spawn `cavecrew-investigator` with: ticket description + acceptance criteria → locate affected files, relevant types/interfaces, entry points, integration touch-points.
|
||||||
|
4. **If anything is ambiguous (scope unclear, acceptance criteria missing, design decisions needed), use `AskUserQuestion` tool to ask — max 4 questions at once.**
|
||||||
|
5. **Report plan to user: what will be added/changed, which files, which modules. No file writes yet. Wait for acknowledgement before continuing.**
|
||||||
|
|
||||||
|
## Step 4 — Implement
|
||||||
|
|
||||||
|
1. Implement feature (use `scala-implementer` agent for non-trivial changes; inline edits for small ones).
|
||||||
|
2. Run `./compile` — must be green.
|
||||||
|
3. Run `./test` — must be green (add new tests for new behaviour; do not modify existing tests unless requirements changed).
|
||||||
|
4. Run `./gradlew spotlessScalaApply` — **blocking, foreground only**. Wait for completion before continuing.
|
||||||
|
5. Run `./lint` — **blocking, foreground only** (never `run_in_background`). Wait for exit code 0. Must be green.
|
||||||
|
- If lint fails, fix all issues and re-run until exit code 0.
|
||||||
|
- **Do NOT proceed to Step 5 until `./lint` has completed and returned exit code 0.**
|
||||||
|
If any step fails, iterate until all pass.
|
||||||
|
|
||||||
|
## Step 5 — Review
|
||||||
|
|
||||||
|
Spawn `cavecrew-reviewer` on the full diff.
|
||||||
|
Display findings grouped by severity.
|
||||||
|
|
||||||
|
## Step 5b — Apply Review Findings
|
||||||
|
|
||||||
|
If the review produced any findings (any severity):
|
||||||
|
1. Implement all agreed fixes.
|
||||||
|
2. Run `./compile` — must be green.
|
||||||
|
3. Run `./test` — must be green.
|
||||||
|
4. Run `./gradlew spotlessScalaApply` — **blocking, foreground only**. Wait for completion.
|
||||||
|
5. Run `./lint` — **blocking, foreground only**. Wait for exit code 0.
|
||||||
|
- If lint fails, fix all issues and re-run until exit code 0.
|
||||||
|
6. Re-spawn `cavecrew-reviewer` on the updated diff to confirm all findings are resolved.
|
||||||
|
|
||||||
|
Repeat until review is clean or user explicitly accepts remaining findings.
|
||||||
|
|
||||||
|
## Step 6 — Confirm + Push
|
||||||
|
|
||||||
|
Show summary: ticket, branch, files changed, review findings.
|
||||||
|
**Use `AskUserQuestion` tool to ask for explicit approval before pushing.** Include any open questions about commit message scope or body if unclear.
|
||||||
|
|
||||||
|
On approval, commit following Conventional Commits:
|
||||||
|
|
||||||
|
```
|
||||||
|
<type>(<scope>): <short description, imperative, ≤50 chars>
|
||||||
|
|
||||||
|
<optional body: what changed and why, wrap at 72 chars>
|
||||||
|
|
||||||
|
Closes $ARGUMENTS
|
||||||
|
https://knockoutwhist.youtrack.cloud/issue/$ARGUMENTS
|
||||||
|
```
|
||||||
|
|
||||||
|
- `type`: same as branch type (`feat`, `refactor`, `chore`, etc.)
|
||||||
|
- `scope`: affected module (`core`, `rule`, `api`, `bot`, `io`)
|
||||||
|
- Subject: imperative mood, no period, lowercase
|
||||||
|
- Footer `Closes $ARGUMENTS` and ticket URL always present
|
||||||
|
|
||||||
|
Push branch to remote.
|
||||||
|
|
||||||
|
## Step 7 — Comment on Ticket
|
||||||
|
|
||||||
|
After successful push, call `mcp__youtrack__add_issue_comment` on `$ARGUMENTS` with:
|
||||||
|
|
||||||
|
```
|
||||||
|
Branch `<branch-name>` pushed.
|
||||||
|
|
||||||
|
<one-sentence summary of what was added and why>
|
||||||
|
|
||||||
|
Files changed:
|
||||||
|
- <file1>
|
||||||
|
- <file2>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 8 — Cleanup
|
||||||
|
|
||||||
|
Call `ExitWorktree` with `discard_changes: true` to delete the worktree.
|
||||||
|
(Branch was pushed in step 6 — commits are safe on remote; `discard_changes: true` bypasses the local-ahead guard.)
|
||||||
|
Report: branch pushed, ticket commented, worktree deleted, done.
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
# Split Story into Subtasks in YouTrack
|
||||||
|
|
||||||
|
Split a user story into smaller, implementable subtasks. Story ID: `$ARGUMENTS`
|
||||||
|
|
||||||
|
## Step 1 — Fetch Story
|
||||||
|
|
||||||
|
Call `mcp__youtrack__get_issue` with ID `$ARGUMENTS`.
|
||||||
|
Extract and display: summary, description, acceptance criteria, implementation notes.
|
||||||
|
|
||||||
|
## Step 2 — Research (if needed)
|
||||||
|
|
||||||
|
If the story involves unfamiliar domain logic or technical constraints:
|
||||||
|
- Search repo for relevant code (`Grep`/`Bash`).
|
||||||
|
- Use `WebSearch` for external standards or protocols.
|
||||||
|
- Do NOT guess. Surface findings before proposing splits.
|
||||||
|
|
||||||
|
## Step 3 — Propose Split
|
||||||
|
|
||||||
|
Analyse the story and propose a set of subtasks. Rules:
|
||||||
|
- Each subtask = one unit of work, completable independently or in sequence.
|
||||||
|
- No subtask should exceed ~2 days of work.
|
||||||
|
- Name subtasks in imperative mood (e.g. "Implement move validation endpoint").
|
||||||
|
- Cover the full scope of the parent story — no gaps.
|
||||||
|
|
||||||
|
Show proposed subtask list to user (titles only) and ask:
|
||||||
|
**Use `AskUserQuestion` tool:**
|
||||||
|
- Does the split look right?
|
||||||
|
- Any subtasks to add, remove, or merge?
|
||||||
|
- Should any subtask be assigned to a specific person?
|
||||||
|
|
||||||
|
Incorporate feedback. Repeat until user approves the list.
|
||||||
|
|
||||||
|
## Step 4 — Draft Each Subtask
|
||||||
|
|
||||||
|
For each approved subtask, compose description using this template:
|
||||||
|
|
||||||
|
```
|
||||||
|
[Brief description of what needs to be done for this subtask.]
|
||||||
|
|
||||||
|
|
||||||
|
Steps / Tasks
|
||||||
|
|
||||||
|
- Task 1
|
||||||
|
- Task 2
|
||||||
|
- Task 3
|
||||||
|
|
||||||
|
|
||||||
|
Definition of Done
|
||||||
|
|
||||||
|
What must be true for this subtask to be considered complete:
|
||||||
|
|
||||||
|
- Code implemented
|
||||||
|
- Tests passed
|
||||||
|
- Reviewed and merged
|
||||||
|
```
|
||||||
|
|
||||||
|
Rules:
|
||||||
|
- Steps/Tasks: concrete, ordered where order matters.
|
||||||
|
- Definition of Done: adjust per subtask — not all subtasks need the same criteria (e.g. a research spike has different DoD than an implementation task).
|
||||||
|
- Keep description short — one paragraph max.
|
||||||
|
|
||||||
|
## Step 5 — Determine Project per Subtask
|
||||||
|
|
||||||
|
Assign each subtask's project based on its content — do **not** inherit blindly from parent:
|
||||||
|
|
||||||
|
- Backend code (game engine, bots, API, services, coordinator) → `NCS`
|
||||||
|
- Frontend code (UI, UX, web app) → `NCWF`
|
||||||
|
- Kubernetes, pipelines, CI/CD, DB setup, infrastructure → `NCI`
|
||||||
|
|
||||||
|
If a subtask's project is ambiguous, ask the user before creating it.
|
||||||
|
|
||||||
|
## Step 6 — Create Subtasks
|
||||||
|
|
||||||
|
For each subtask call `mcp__youtrack__create_issue` with:
|
||||||
|
- `project`: from Step 5
|
||||||
|
- `summary`: subtask title (≤72 chars, sentence case)
|
||||||
|
- `description`: full formatted description from Step 4 (Markdown)
|
||||||
|
- `type`: `Task`
|
||||||
|
|
||||||
|
Then call `mcp__youtrack__link_issues` to link each created subtask to `$ARGUMENTS` with relation `subtask of`.
|
||||||
|
|
||||||
|
## Step 6b — Inter-Subtask Links
|
||||||
|
|
||||||
|
If subtasks must be done in sequence (one depends on output of another), add ordering links:
|
||||||
|
- For each dependency pair call `mcp__youtrack__link_issues` with relation `is blocked by` (subtask B is blocked by subtask A).
|
||||||
|
|
||||||
|
Ask the user to confirm sequencing before adding these links:
|
||||||
|
|
||||||
|
> Do any subtasks have ordering dependencies? (e.g. "Implement X must come before Add tests for X")
|
||||||
|
|
||||||
|
## Step 6c — External Links
|
||||||
|
|
||||||
|
Scan `$ARGUMENTS` description and implementation notes for any referenced issue IDs not already linked. For each:
|
||||||
|
|
||||||
|
| Situation | Relation |
|
||||||
|
|-----------|---------|
|
||||||
|
| Parent story blocks another epic/story | `blocks` |
|
||||||
|
| Story depends on another epic completing | `is blocked by` |
|
||||||
|
| Related story in same domain | `relates to` |
|
||||||
|
| This story duplicates or supersedes | `duplicates` |
|
||||||
|
|
||||||
|
Suggest links to the user and call `mcp__youtrack__link_issues` on confirmation.
|
||||||
|
|
||||||
|
## Step 7 — Report
|
||||||
|
|
||||||
|
List all created subtask IDs and summaries.
|
||||||
|
List all links created (subtask-of, blocking chains, external).
|
||||||
|
Display parent story link.
|
||||||
|
Ask if any subtask needs further splitting.
|
||||||
+223
-194
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
> **Stack:** raw-http | none | unknown | scala
|
> **Stack:** raw-http | none | unknown | scala
|
||||||
|
|
||||||
> 0 routes + 40 rpc | 0 models | 0 components | 146 lib files | 1 env vars | 1 middleware
|
> 0 routes + 40 rpc | 0 models | 0 components | 164 lib files | 1 env vars | 1 middleware
|
||||||
> **Token savings:** this file is ~0 tokens. Without it, AI exploration would cost ~0 tokens. **Saves ~0 tokens per conversation.**
|
> **Token savings:** this file is ~0 tokens. Without it, AI exploration would cost ~0 tokens. **Saves ~0 tokens per conversation.**
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -75,6 +75,7 @@
|
|||||||
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
|
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
|
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — class RedisConfig
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
|
||||||
- class Challenge
|
- class Challenge
|
||||||
- function gameIdOpt
|
- function gameIdOpt
|
||||||
@@ -100,7 +101,7 @@
|
|||||||
- function persist
|
- function persist
|
||||||
- function findByEmail
|
- function findByEmail
|
||||||
- function findAll
|
- function findAll
|
||||||
- _...12 more_
|
- _...11 more_
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
|
||||||
- class ChallengeRepository
|
- class ChallengeRepository
|
||||||
- function findActiveByChallengerId
|
- function findActiveByChallengerId
|
||||||
@@ -116,30 +117,37 @@
|
|||||||
- function me
|
- function me
|
||||||
- function publicProfile
|
- function publicProfile
|
||||||
- function banUser
|
- function banUser
|
||||||
- _...10 more_
|
- _...9 more_
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
|
||||||
- class ChallengeResource
|
- class ChallengeResource
|
||||||
- function create
|
- function create
|
||||||
- function list
|
- function list
|
||||||
|
- function get
|
||||||
- function accept
|
- function accept
|
||||||
- function decline
|
- function decline
|
||||||
- function cancel
|
- _...1 more_
|
||||||
|
- `modules/account/src/main/scala/de/nowchess/account/resource/OfficialChallengeResource.scala` — class OfficialChallengeResource, function challengeWithDifficulty
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
|
||||||
- class AccountService
|
- class AccountService
|
||||||
|
- function initializeMetrics
|
||||||
- function register
|
- function register
|
||||||
- function login
|
- function login
|
||||||
- function findByUsername
|
- function findByUsername
|
||||||
- function findById
|
- function findById
|
||||||
- function createBotAccount
|
|
||||||
- _...11 more_
|
- _...11 more_
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
|
||||||
- class ChallengeService
|
- class ChallengeService
|
||||||
|
- function initializeMetrics
|
||||||
- function create
|
- function create
|
||||||
- function accept
|
- function accept
|
||||||
- function decline
|
- function decline
|
||||||
- function cancel
|
- function cancel
|
||||||
- function listForUser
|
- _...3 more_
|
||||||
- _...1 more_
|
- `modules/account/src/main/scala/de/nowchess/account/service/EventPublisher.scala`
|
||||||
|
- class EventPublisher
|
||||||
|
- function publishGameStart
|
||||||
|
- function publishChallengeCreated
|
||||||
|
- function publishChallengeAccepted
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
|
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
|
||||||
- class Board
|
- class Board
|
||||||
- function apply
|
- function apply
|
||||||
@@ -162,10 +170,6 @@
|
|||||||
- class Square
|
- class Square
|
||||||
- function fromAlgebraic
|
- function fromAlgebraic
|
||||||
- function offset
|
- function offset
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`
|
|
||||||
- class Bot
|
|
||||||
- function name
|
|
||||||
- function nextMove
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
|
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
|
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
|
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
|
||||||
@@ -186,6 +190,14 @@
|
|||||||
- function withEnPassantSquare
|
- function withEnPassantSquare
|
||||||
- function withHalfMoveClock
|
- function withHalfMoveClock
|
||||||
- _...4 more_
|
- _...4 more_
|
||||||
|
- `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`
|
||||||
|
- class ProtoMapperBase
|
||||||
|
- function toProtoColor
|
||||||
|
- function fromProtoColor
|
||||||
|
- function toProtoPieceType
|
||||||
|
- function fromProtoPieceType
|
||||||
|
- function toProtoMoveKind
|
||||||
|
- _...17 more_
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
|
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
|
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
|
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
|
||||||
@@ -201,115 +213,21 @@
|
|||||||
- function isCheck
|
- function isCheck
|
||||||
- function isCheckmate
|
- function isCheckmate
|
||||||
- _...6 more_
|
- _...6 more_
|
||||||
- `modules/bot/python/nnue.py`
|
- `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- function get_weights_dir: ()
|
- `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/RedisConfig.scala` — class RedisConfig
|
||||||
- function get_data_dir: ()
|
- `modules/bot-platform/src/main/scala/de/nowchess/botplatform/registry/BotRegistry.scala`
|
||||||
- function list_checkpoints: ()
|
- class BotRegistry
|
||||||
- function migrate_legacy_data: ()
|
- function register
|
||||||
- function show_header: ()
|
- function unregister
|
||||||
- function show_checkpoints_table: ()
|
- function dispatch
|
||||||
- _...10 more_
|
- function registeredBots
|
||||||
- `modules/bot/python/src/dataset.py`
|
- `modules/bot-platform/src/main/scala/de/nowchess/botplatform/resource/BotEventResource.scala`
|
||||||
- function get_datasets_dir: () -> Path
|
- class BotEventResource
|
||||||
- function next_dataset_version: () -> int
|
- function streamEvents
|
||||||
- function list_datasets: () -> List[Tuple[int, Dict]]
|
- function streamGame
|
||||||
- function load_dataset_metadata: (version) -> Optional[Dict]
|
- function makeMove
|
||||||
- function save_dataset_metadata: (version, metadata) -> None
|
|
||||||
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
|
|
||||||
- _...4 more_
|
|
||||||
- `modules/bot/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
|
|
||||||
- `modules/bot/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
|
|
||||||
- `modules/bot/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
|
|
||||||
- `modules/bot/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
|
|
||||||
- `modules/bot/python/src/tactical_positions_extractor.py`
|
|
||||||
- function download_and_extract_puzzle_db: (url, output_dir)
|
|
||||||
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
|
|
||||||
- function load_positions_from_file: (file_path) -> Set[str]
|
|
||||||
- function merge_positions: (tactical, other, output_file)
|
|
||||||
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
|
|
||||||
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
|
|
||||||
- `modules/bot/python/src/train.py`
|
|
||||||
- function fen_to_features: (fen)
|
|
||||||
- function find_next_version: (base_name)
|
|
||||||
- function save_metadata: (weights_file, metadata)
|
|
||||||
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
|
|
||||||
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
|
|
||||||
- class NNUEDataset
|
|
||||||
- _...1 more_
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/BotController.scala`
|
|
||||||
- class BotController
|
|
||||||
- function getBot
|
|
||||||
- function listBots
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
|
|
||||||
- class BotMoveRepetition
|
|
||||||
- function blockedMoves
|
|
||||||
- function repeatedMove
|
|
||||||
- function filterAllowed
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/Config.scala` — class Config
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
|
|
||||||
- class Evaluation
|
|
||||||
- class CHECKMATE_SCORE
|
|
||||||
- class DRAW_SCORE
|
|
||||||
- function evaluate
|
|
||||||
- function initAccumulator
|
|
||||||
- function copyAccumulator
|
|
||||||
- _...2 more_
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
|
|
||||||
- class EvaluationClassic
|
|
||||||
- function evaluate
|
|
||||||
- function countRay
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
|
|
||||||
- class NNUE
|
|
||||||
- function initAccumulator
|
|
||||||
- function pushAccumulator
|
|
||||||
- function copyAccumulator
|
|
||||||
- function recomputeAccumulator
|
|
||||||
- function validateAccumulator
|
|
||||||
- _...4 more_
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
|
|
||||||
- class NbaiLoader
|
|
||||||
- function load
|
|
||||||
- function loadDefault
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
|
|
||||||
- function toJson
|
|
||||||
- class NbaiMetadata
|
|
||||||
- function fromJson
|
|
||||||
- function str
|
|
||||||
- function num
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
|
|
||||||
- function bestMove
|
|
||||||
- function bestMove
|
|
||||||
- function bestMoveWithTime
|
|
||||||
- function bestMoveWithTime
|
|
||||||
- function loop
|
|
||||||
- function loop
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
|
|
||||||
- class MoveOrdering
|
|
||||||
- class OrderingContext
|
|
||||||
- function addKillerMove
|
|
||||||
- function getKillerMoves
|
|
||||||
- function addHistory
|
|
||||||
- function getHistory
|
|
||||||
- _...3 more_
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
|
|
||||||
- function advance
|
|
||||||
- function probe
|
|
||||||
- function store
|
|
||||||
- function clear
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
|
|
||||||
- class ZobristHash
|
|
||||||
- function hash
|
|
||||||
- function nextHash
|
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala` — class BeansProducer, function kubernetesClient
|
||||||
- class BeansProducer
|
|
||||||
- function redissonClient
|
|
||||||
- function kubernetesClient
|
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
|
||||||
- class CoordinatorConfig
|
- class CoordinatorConfig
|
||||||
- function maxGamesPerCore
|
- function maxGamesPerCore
|
||||||
@@ -317,10 +235,10 @@
|
|||||||
- function rebalanceInterval
|
- function rebalanceInterval
|
||||||
- function rebalanceMinInterval
|
- function rebalanceMinInterval
|
||||||
- function heartbeatTtl
|
- function heartbeatTtl
|
||||||
- _...11 more_
|
- _...14 more_
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoordinatorGrpcServer.scala` — class CoordinatorGrpcServer
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoordinatorGrpcServer.scala` — class CoordinatorGrpcServer, function hasActiveStream
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoreGrpcClient.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoreGrpcClient.scala`
|
||||||
- class CoreGrpcClient
|
- class CoreGrpcClient
|
||||||
- function shutdown
|
- function shutdown
|
||||||
@@ -337,12 +255,16 @@
|
|||||||
- _...1 more_
|
- _...1 more_
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/AutoScaler.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/AutoScaler.scala`
|
||||||
- class AutoScaler
|
- class AutoScaler
|
||||||
|
- function initMetrics
|
||||||
|
- function periodicScaleCheck
|
||||||
- function checkAndScale
|
- function checkAndScale
|
||||||
- function scaleUp
|
- function scaleUp
|
||||||
- function scaleDown
|
- function scaleDown
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/CacheEvictionManager.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/CacheEvictionManager.scala`
|
||||||
- class CacheEvictionManager
|
- class CacheEvictionManager
|
||||||
- function setRedisPrefix
|
- function setRedisPrefix
|
||||||
|
- function initializeMetrics
|
||||||
|
- function periodicCacheEviction
|
||||||
- function evictStaleGames
|
- function evictStaleGames
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/FailoverService.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/FailoverService.scala`
|
||||||
- class FailoverService
|
- class FailoverService
|
||||||
@@ -351,21 +273,24 @@
|
|||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/HealthMonitor.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/HealthMonitor.scala`
|
||||||
- class HealthMonitor
|
- class HealthMonitor
|
||||||
- function setRedisPrefix
|
- function setRedisPrefix
|
||||||
|
- function initializeMetrics
|
||||||
|
- function onStartup
|
||||||
|
- function periodicHealthCheck
|
||||||
- function checkInstanceHealth
|
- function checkInstanceHealth
|
||||||
- function watchK8sPods
|
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/InstanceRegistry.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/InstanceRegistry.scala`
|
||||||
- class InstanceRegistry
|
- class InstanceRegistry
|
||||||
|
- function initMetrics
|
||||||
- function setRedisPrefix
|
- function setRedisPrefix
|
||||||
|
- function loadAllFromRedis
|
||||||
- function getInstance
|
- function getInstance
|
||||||
- function getAllInstances
|
- function getAllInstances
|
||||||
- function updateInstanceFromRedis
|
- _...4 more_
|
||||||
- function markInstanceDead
|
|
||||||
- _...1 more_
|
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/LoadBalancer.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/LoadBalancer.scala`
|
||||||
- class LoadBalancer
|
- class LoadBalancer
|
||||||
- function setRedisPrefix
|
- function setRedisPrefix
|
||||||
- function shouldRebalance
|
- function shouldRebalance
|
||||||
- function rebalance
|
- function rebalance
|
||||||
|
- function periodicRebalanceCheck
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala`
|
||||||
- class RuleSetRestAdapter
|
- class RuleSetRestAdapter
|
||||||
- function candidateMoves
|
- function candidateMoves
|
||||||
@@ -393,10 +318,6 @@
|
|||||||
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
|
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/config/RedissonProducer.scala`
|
|
||||||
- class RedissonProducer
|
|
||||||
- function produceRedissonClient
|
|
||||||
- function shutdown
|
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
|
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
|
||||||
- class GameEngine
|
- class GameEngine
|
||||||
@@ -412,14 +333,7 @@
|
|||||||
- class BadRequestException
|
- class BadRequestException
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
|
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
|
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` — class CoreProtoMapper
|
||||||
- class CoreProtoMapper
|
|
||||||
- function toProtoColor
|
|
||||||
- function fromProtoColor
|
|
||||||
- function toProtoPieceType
|
|
||||||
- function fromProtoPieceType
|
|
||||||
- function toProtoMoveKind
|
|
||||||
- _...9 more_
|
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
|
||||||
- class IoGrpcClientWrapper
|
- class IoGrpcClientWrapper
|
||||||
- function exportCombined
|
- function exportCombined
|
||||||
@@ -444,15 +358,18 @@
|
|||||||
- function unsubscribe
|
- function unsubscribe
|
||||||
- _...1 more_
|
- _...1 more_
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
|
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala` — class GameRedisPublisher, function onGameEvent
|
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala`
|
||||||
|
- class GameRedisPublisher
|
||||||
|
- class GameRedisPublisher
|
||||||
|
- function onGameEvent
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
|
||||||
- class GameRedisSubscriberManager
|
- class GameRedisSubscriberManager
|
||||||
- function subscribeGame
|
- function subscribeGame
|
||||||
- function onMessage
|
|
||||||
- function unsubscribeGame
|
- function unsubscribeGame
|
||||||
- function batchResubscribeGames
|
- function batchResubscribeGames
|
||||||
- function unsubscribeGames
|
- function unsubscribeGames
|
||||||
- _...3 more_
|
- function evictGames
|
||||||
|
- _...2 more_
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
|
||||||
- class GameRegistry
|
- class GameRegistry
|
||||||
- function store
|
- function store
|
||||||
@@ -461,6 +378,7 @@
|
|||||||
- function generateId
|
- function generateId
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/registry/RedisGameRegistry.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/registry/RedisGameRegistry.scala`
|
||||||
- class RedisGameRegistry
|
- class RedisGameRegistry
|
||||||
|
- function initMetrics
|
||||||
- function generateId
|
- function generateId
|
||||||
- function store
|
- function store
|
||||||
- function get
|
- function get
|
||||||
@@ -518,14 +436,7 @@
|
|||||||
- function importGameContext
|
- function importGameContext
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
|
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
|
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala`
|
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala` — class IoProtoMapper
|
||||||
- class IoProtoMapper
|
|
||||||
- function toProtoColor
|
|
||||||
- function fromProtoColor
|
|
||||||
- function toProtoPieceType
|
|
||||||
- function fromProtoPieceType
|
|
||||||
- function toProtoMoveKind
|
|
||||||
- _...9 more_
|
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
|
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
|
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
|
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
|
||||||
@@ -556,16 +467,127 @@
|
|||||||
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
|
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
|
||||||
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
|
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
|
||||||
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
|
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
|
||||||
|
- `modules/official-bots/python/nnue.py`
|
||||||
|
- function get_weights_dir: ()
|
||||||
|
- function get_data_dir: ()
|
||||||
|
- function list_checkpoints: ()
|
||||||
|
- function migrate_legacy_data: ()
|
||||||
|
- function show_header: ()
|
||||||
|
- function show_checkpoints_table: ()
|
||||||
|
- _...10 more_
|
||||||
|
- `modules/official-bots/python/src/dataset.py`
|
||||||
|
- function get_datasets_dir: () -> Path
|
||||||
|
- function next_dataset_version: () -> int
|
||||||
|
- function list_datasets: () -> List[Tuple[int, Dict]]
|
||||||
|
- function load_dataset_metadata: (version) -> Optional[Dict]
|
||||||
|
- function save_dataset_metadata: (version, metadata) -> None
|
||||||
|
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
|
||||||
|
- _...4 more_
|
||||||
|
- `modules/official-bots/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
|
||||||
|
- `modules/official-bots/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
|
||||||
|
- `modules/official-bots/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
|
||||||
|
- `modules/official-bots/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
|
||||||
|
- `modules/official-bots/python/src/tactical_positions_extractor.py`
|
||||||
|
- function download_and_extract_puzzle_db: (url, output_dir)
|
||||||
|
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
|
||||||
|
- function load_positions_from_file: (file_path) -> Set[str]
|
||||||
|
- function merge_positions: (tactical, other, output_file)
|
||||||
|
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
|
||||||
|
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
|
||||||
|
- `modules/official-bots/python/src/train.py`
|
||||||
|
- function fen_to_features: (fen)
|
||||||
|
- function find_next_version: (base_name)
|
||||||
|
- function save_metadata: (weights_file, metadata)
|
||||||
|
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
|
||||||
|
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
|
||||||
|
- class NNUEDataset
|
||||||
|
- _...1 more_
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotController.scala`
|
||||||
|
- class BotController
|
||||||
|
- function getBot
|
||||||
|
- function listBots
|
||||||
|
- class BotController
|
||||||
|
- function getBot
|
||||||
|
- function listBots
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
|
||||||
|
- class BotMoveRepetition
|
||||||
|
- function blockedMoves
|
||||||
|
- function repeatedMove
|
||||||
|
- function filterAllowed
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/Config.scala` — class Config
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
|
||||||
|
- class Evaluation
|
||||||
|
- class CHECKMATE_SCORE
|
||||||
|
- class DRAW_SCORE
|
||||||
|
- function evaluate
|
||||||
|
- function initAccumulator
|
||||||
|
- function copyAccumulator
|
||||||
|
- _...2 more_
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala` — class ClassicalBot, function apply
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/HybridBot.scala` — class HybridBot, function apply
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala` — class NNUEBot, function apply
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
|
||||||
|
- class EvaluationClassic
|
||||||
|
- function evaluate
|
||||||
|
- function countRay
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
|
||||||
|
- class NNUE
|
||||||
|
- function initAccumulator
|
||||||
|
- function pushAccumulator
|
||||||
|
- function copyAccumulator
|
||||||
|
- function recomputeAccumulator
|
||||||
|
- function validateAccumulator
|
||||||
|
- _...4 more_
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
|
||||||
|
- class NbaiLoader
|
||||||
|
- function load
|
||||||
|
- function loadDefault
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
|
||||||
|
- function toJson
|
||||||
|
- class NbaiMetadata
|
||||||
|
- function fromJson
|
||||||
|
- function str
|
||||||
|
- function num
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/RedisConfig.scala` — class RedisConfig
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
|
||||||
|
- function bestMove
|
||||||
|
- function bestMove
|
||||||
|
- function bestMoveWithTime
|
||||||
|
- function bestMoveWithTime
|
||||||
|
- function loop
|
||||||
|
- function loop
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
|
||||||
|
- class MoveOrdering
|
||||||
|
- class OrderingContext
|
||||||
|
- function addKillerMove
|
||||||
|
- function getKillerMoves
|
||||||
|
- function addHistory
|
||||||
|
- function getHistory
|
||||||
|
- _...3 more_
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
|
||||||
|
- function advance
|
||||||
|
- function probe
|
||||||
|
- function store
|
||||||
|
- function clear
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/resource/OfficialBotChallengeResource.scala` — class OfficialBotChallengeResource, function challengeWithDifficulty
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/DifficultyMapper.scala` — class DifficultyMapper, function fromElo
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/OfficialBotService.scala`
|
||||||
|
- class OfficialBotService
|
||||||
|
- function initializeMetrics
|
||||||
|
- function onStart
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
|
||||||
|
- class ZobristHash
|
||||||
|
- function hash
|
||||||
|
- function nextHash
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala`
|
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala` — class ProtoMapper
|
||||||
- class ProtoMapper
|
|
||||||
- function toProtoColor
|
|
||||||
- function fromProtoColor
|
|
||||||
- function toProtoPieceType
|
|
||||||
- function fromProtoPieceType
|
|
||||||
- function toProtoMoveKind
|
|
||||||
- _...9 more_
|
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
|
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
|
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
|
||||||
- class RuleSetResource
|
- class RuleSetResource
|
||||||
@@ -576,38 +598,45 @@
|
|||||||
- function isCheckmate
|
- function isCheckmate
|
||||||
- _...6 more_
|
- _...6 more_
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
|
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalAuthFilter.scala` — class InternalAuthFilter
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalClientHeadersFactory.scala` — class InternalClientHeadersFactory
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalGrpcAuthInterceptor.scala` — class InternalGrpcAuthInterceptor
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalGrpcSecretClientInterceptor.scala` — class InternalGrpcSecretClientInterceptor
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalSecretClientFilter.scala` — class InternalSecretClientFilter
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
|
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/config/RedissonProducer.scala`
|
|
||||||
- class RedissonProducer
|
|
||||||
- function redissonClient
|
|
||||||
- function close
|
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
|
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala`
|
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala` — class GameWritebackStreamListener, function startListening
|
||||||
- class GameWritebackStreamListener
|
|
||||||
- function startListening
|
|
||||||
- function onMessage
|
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
|
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
|
||||||
- class GameRecordRepository
|
- class GameRecordRepository
|
||||||
- function findByGameId
|
- function findByGameId
|
||||||
- function persist
|
- function persist
|
||||||
- function merge
|
- function merge
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala` — class StoreGameResource, function getGame
|
- function findByPlayerId
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack
|
- function findByPlayerIdRunning
|
||||||
|
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala`
|
||||||
|
- class StoreGameResource
|
||||||
|
- function getGame
|
||||||
|
- function getRunning
|
||||||
|
- function getHistory
|
||||||
|
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala`
|
||||||
|
- class GameWritebackService
|
||||||
|
- function initializeMetrics
|
||||||
|
- function writeBack
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
|
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedissonProducer.scala`
|
|
||||||
- class RedissonProducer
|
|
||||||
- function produceRedissonClient
|
|
||||||
- function shutdown
|
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
|
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
|
||||||
- class GameWebSocketResource
|
- class GameWebSocketResource
|
||||||
|
- function initializeMetrics
|
||||||
- function onOpen
|
- function onOpen
|
||||||
- function onMessage
|
|
||||||
- function onTextMessage
|
- function onTextMessage
|
||||||
- function onClose
|
- function onClose
|
||||||
|
- `modules/ws/src/main/scala/de/nowchess/ws/resource/UserWebSocketResource.scala`
|
||||||
|
- class UserWebSocketResource
|
||||||
|
- function onOpen
|
||||||
|
- function onClose
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -615,14 +644,14 @@
|
|||||||
|
|
||||||
## Environment Variables
|
## Environment Variables
|
||||||
|
|
||||||
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py
|
- `STOCKFISH_PATH` **required** — modules/official-bots/python/nnue.py
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Middleware
|
# Middleware
|
||||||
|
|
||||||
## custom
|
## custom
|
||||||
- generate — `modules/bot/python/src/generate.py`
|
- generate — `modules/official-bots/python/src/generate.py`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -631,38 +660,38 @@
|
|||||||
## Most Imported Files (change these carefully)
|
## Most Imported Files (change these carefully)
|
||||||
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **57** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **56** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **55** files
|
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **54** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **28** files
|
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **27** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **20** files
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **20** files
|
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **20** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **18** files
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **20** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **18** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **19** files
|
||||||
|
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **19** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
|
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **13** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **12** files
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **11** files
|
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **12** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **9** files
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
|
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
|
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
|
||||||
|
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — imported by **8** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
|
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **7** files
|
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **8** files
|
||||||
|
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **6** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala` — imported by **6** files
|
|
||||||
|
|
||||||
## Import Map (who imports what)
|
## Import Map (who imports what)
|
||||||
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` ← `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` +71 more
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` ← `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +71 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +52 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +51 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` ← `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +50 more
|
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +49 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` ← `modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +23 more
|
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` ← `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineClockTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineDrawOfferTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineGameEndingTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +22 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala` +15 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` +15 more
|
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` ← `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` ← `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` ← `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` ← `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` +13 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +14 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` ← `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala` +13 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` ← `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala`, `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` +14 more
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
## Environment Variables
|
## Environment Variables
|
||||||
|
|
||||||
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py
|
- `STOCKFISH_PATH` **required** — modules/official-bots/python/nnue.py
|
||||||
|
|||||||
+21
-21
@@ -3,35 +3,35 @@
|
|||||||
## Most Imported Files (change these carefully)
|
## Most Imported Files (change these carefully)
|
||||||
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **57** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **56** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **55** files
|
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **54** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **28** files
|
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **27** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **20** files
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **20** files
|
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **20** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **18** files
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **20** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **18** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **19** files
|
||||||
|
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **19** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
|
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **13** files
|
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **12** files
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **11** files
|
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **12** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **9** files
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
|
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
|
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
|
||||||
|
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — imported by **8** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
|
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **7** files
|
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **8** files
|
||||||
|
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **6** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala` — imported by **6** files
|
|
||||||
|
|
||||||
## Import Map (who imports what)
|
## Import Map (who imports what)
|
||||||
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` ← `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` +71 more
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` ← `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +71 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +52 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +51 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` ← `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +50 more
|
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala` +49 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` ← `modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +23 more
|
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` ← `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineClockTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineDrawOfferTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineGameEndingTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +22 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala` +15 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` +15 more
|
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` ← `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` ← `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more
|
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` ← `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` +15 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` ← `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` +13 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` ← `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +14 more
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` ← `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala` +13 more
|
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` ← `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala`, `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` +14 more
|
||||||
|
|||||||
+199
-170
@@ -19,6 +19,7 @@
|
|||||||
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
|
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
|
- `modules/account/src/main/scala/de/nowchess/account/config/RedisConfig.scala` — class RedisConfig
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
|
||||||
- class Challenge
|
- class Challenge
|
||||||
- function gameIdOpt
|
- function gameIdOpt
|
||||||
@@ -44,7 +45,7 @@
|
|||||||
- function persist
|
- function persist
|
||||||
- function findByEmail
|
- function findByEmail
|
||||||
- function findAll
|
- function findAll
|
||||||
- _...12 more_
|
- _...11 more_
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
|
||||||
- class ChallengeRepository
|
- class ChallengeRepository
|
||||||
- function findActiveByChallengerId
|
- function findActiveByChallengerId
|
||||||
@@ -60,30 +61,37 @@
|
|||||||
- function me
|
- function me
|
||||||
- function publicProfile
|
- function publicProfile
|
||||||
- function banUser
|
- function banUser
|
||||||
- _...10 more_
|
- _...9 more_
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
|
||||||
- class ChallengeResource
|
- class ChallengeResource
|
||||||
- function create
|
- function create
|
||||||
- function list
|
- function list
|
||||||
|
- function get
|
||||||
- function accept
|
- function accept
|
||||||
- function decline
|
- function decline
|
||||||
- function cancel
|
- _...1 more_
|
||||||
|
- `modules/account/src/main/scala/de/nowchess/account/resource/OfficialChallengeResource.scala` — class OfficialChallengeResource, function challengeWithDifficulty
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
|
||||||
- class AccountService
|
- class AccountService
|
||||||
|
- function initializeMetrics
|
||||||
- function register
|
- function register
|
||||||
- function login
|
- function login
|
||||||
- function findByUsername
|
- function findByUsername
|
||||||
- function findById
|
- function findById
|
||||||
- function createBotAccount
|
|
||||||
- _...11 more_
|
- _...11 more_
|
||||||
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
|
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
|
||||||
- class ChallengeService
|
- class ChallengeService
|
||||||
|
- function initializeMetrics
|
||||||
- function create
|
- function create
|
||||||
- function accept
|
- function accept
|
||||||
- function decline
|
- function decline
|
||||||
- function cancel
|
- function cancel
|
||||||
- function listForUser
|
- _...3 more_
|
||||||
- _...1 more_
|
- `modules/account/src/main/scala/de/nowchess/account/service/EventPublisher.scala`
|
||||||
|
- class EventPublisher
|
||||||
|
- function publishGameStart
|
||||||
|
- function publishChallengeCreated
|
||||||
|
- function publishChallengeAccepted
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
|
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
|
||||||
- class Board
|
- class Board
|
||||||
- function apply
|
- function apply
|
||||||
@@ -106,10 +114,6 @@
|
|||||||
- class Square
|
- class Square
|
||||||
- function fromAlgebraic
|
- function fromAlgebraic
|
||||||
- function offset
|
- function offset
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`
|
|
||||||
- class Bot
|
|
||||||
- function name
|
|
||||||
- function nextMove
|
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
|
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
|
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
|
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
|
||||||
@@ -130,6 +134,14 @@
|
|||||||
- function withEnPassantSquare
|
- function withEnPassantSquare
|
||||||
- function withHalfMoveClock
|
- function withHalfMoveClock
|
||||||
- _...4 more_
|
- _...4 more_
|
||||||
|
- `modules/api/src/main/scala/de/nowchess/api/grpc/ProtoMapperBase.scala`
|
||||||
|
- class ProtoMapperBase
|
||||||
|
- function toProtoColor
|
||||||
|
- function fromProtoColor
|
||||||
|
- function toProtoPieceType
|
||||||
|
- function fromProtoPieceType
|
||||||
|
- function toProtoMoveKind
|
||||||
|
- _...17 more_
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
|
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
|
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
|
||||||
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
|
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
|
||||||
@@ -145,115 +157,21 @@
|
|||||||
- function isCheck
|
- function isCheck
|
||||||
- function isCheckmate
|
- function isCheckmate
|
||||||
- _...6 more_
|
- _...6 more_
|
||||||
- `modules/bot/python/nnue.py`
|
- `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- function get_weights_dir: ()
|
- `modules/bot-platform/src/main/scala/de/nowchess/botplatform/config/RedisConfig.scala` — class RedisConfig
|
||||||
- function get_data_dir: ()
|
- `modules/bot-platform/src/main/scala/de/nowchess/botplatform/registry/BotRegistry.scala`
|
||||||
- function list_checkpoints: ()
|
- class BotRegistry
|
||||||
- function migrate_legacy_data: ()
|
- function register
|
||||||
- function show_header: ()
|
- function unregister
|
||||||
- function show_checkpoints_table: ()
|
- function dispatch
|
||||||
- _...10 more_
|
- function registeredBots
|
||||||
- `modules/bot/python/src/dataset.py`
|
- `modules/bot-platform/src/main/scala/de/nowchess/botplatform/resource/BotEventResource.scala`
|
||||||
- function get_datasets_dir: () -> Path
|
- class BotEventResource
|
||||||
- function next_dataset_version: () -> int
|
- function streamEvents
|
||||||
- function list_datasets: () -> List[Tuple[int, Dict]]
|
- function streamGame
|
||||||
- function load_dataset_metadata: (version) -> Optional[Dict]
|
- function makeMove
|
||||||
- function save_dataset_metadata: (version, metadata) -> None
|
|
||||||
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
|
|
||||||
- _...4 more_
|
|
||||||
- `modules/bot/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
|
|
||||||
- `modules/bot/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
|
|
||||||
- `modules/bot/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
|
|
||||||
- `modules/bot/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
|
|
||||||
- `modules/bot/python/src/tactical_positions_extractor.py`
|
|
||||||
- function download_and_extract_puzzle_db: (url, output_dir)
|
|
||||||
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
|
|
||||||
- function load_positions_from_file: (file_path) -> Set[str]
|
|
||||||
- function merge_positions: (tactical, other, output_file)
|
|
||||||
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
|
|
||||||
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
|
|
||||||
- `modules/bot/python/src/train.py`
|
|
||||||
- function fen_to_features: (fen)
|
|
||||||
- function find_next_version: (base_name)
|
|
||||||
- function save_metadata: (weights_file, metadata)
|
|
||||||
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
|
|
||||||
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
|
|
||||||
- class NNUEDataset
|
|
||||||
- _...1 more_
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/BotController.scala`
|
|
||||||
- class BotController
|
|
||||||
- function getBot
|
|
||||||
- function listBots
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
|
|
||||||
- class BotMoveRepetition
|
|
||||||
- function blockedMoves
|
|
||||||
- function repeatedMove
|
|
||||||
- function filterAllowed
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/Config.scala` — class Config
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
|
|
||||||
- class Evaluation
|
|
||||||
- class CHECKMATE_SCORE
|
|
||||||
- class DRAW_SCORE
|
|
||||||
- function evaluate
|
|
||||||
- function initAccumulator
|
|
||||||
- function copyAccumulator
|
|
||||||
- _...2 more_
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
|
|
||||||
- class EvaluationClassic
|
|
||||||
- function evaluate
|
|
||||||
- function countRay
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
|
|
||||||
- class NNUE
|
|
||||||
- function initAccumulator
|
|
||||||
- function pushAccumulator
|
|
||||||
- function copyAccumulator
|
|
||||||
- function recomputeAccumulator
|
|
||||||
- function validateAccumulator
|
|
||||||
- _...4 more_
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
|
|
||||||
- class NbaiLoader
|
|
||||||
- function load
|
|
||||||
- function loadDefault
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
|
|
||||||
- function toJson
|
|
||||||
- class NbaiMetadata
|
|
||||||
- function fromJson
|
|
||||||
- function str
|
|
||||||
- function num
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
|
|
||||||
- function bestMove
|
|
||||||
- function bestMove
|
|
||||||
- function bestMoveWithTime
|
|
||||||
- function bestMoveWithTime
|
|
||||||
- function loop
|
|
||||||
- function loop
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
|
|
||||||
- class MoveOrdering
|
|
||||||
- class OrderingContext
|
|
||||||
- function addKillerMove
|
|
||||||
- function getKillerMoves
|
|
||||||
- function addHistory
|
|
||||||
- function getHistory
|
|
||||||
- _...3 more_
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
|
|
||||||
- function advance
|
|
||||||
- function probe
|
|
||||||
- function store
|
|
||||||
- function clear
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
|
|
||||||
- `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
|
|
||||||
- class ZobristHash
|
|
||||||
- function hash
|
|
||||||
- function nextHash
|
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala` — class BeansProducer, function kubernetesClient
|
||||||
- class BeansProducer
|
|
||||||
- function redissonClient
|
|
||||||
- function kubernetesClient
|
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
|
||||||
- class CoordinatorConfig
|
- class CoordinatorConfig
|
||||||
- function maxGamesPerCore
|
- function maxGamesPerCore
|
||||||
@@ -261,10 +179,10 @@
|
|||||||
- function rebalanceInterval
|
- function rebalanceInterval
|
||||||
- function rebalanceMinInterval
|
- function rebalanceMinInterval
|
||||||
- function heartbeatTtl
|
- function heartbeatTtl
|
||||||
- _...11 more_
|
- _...14 more_
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoordinatorGrpcServer.scala` — class CoordinatorGrpcServer
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoordinatorGrpcServer.scala` — class CoordinatorGrpcServer, function hasActiveStream
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoreGrpcClient.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoreGrpcClient.scala`
|
||||||
- class CoreGrpcClient
|
- class CoreGrpcClient
|
||||||
- function shutdown
|
- function shutdown
|
||||||
@@ -281,12 +199,16 @@
|
|||||||
- _...1 more_
|
- _...1 more_
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/AutoScaler.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/AutoScaler.scala`
|
||||||
- class AutoScaler
|
- class AutoScaler
|
||||||
|
- function initMetrics
|
||||||
|
- function periodicScaleCheck
|
||||||
- function checkAndScale
|
- function checkAndScale
|
||||||
- function scaleUp
|
- function scaleUp
|
||||||
- function scaleDown
|
- function scaleDown
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/CacheEvictionManager.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/CacheEvictionManager.scala`
|
||||||
- class CacheEvictionManager
|
- class CacheEvictionManager
|
||||||
- function setRedisPrefix
|
- function setRedisPrefix
|
||||||
|
- function initializeMetrics
|
||||||
|
- function periodicCacheEviction
|
||||||
- function evictStaleGames
|
- function evictStaleGames
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/FailoverService.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/FailoverService.scala`
|
||||||
- class FailoverService
|
- class FailoverService
|
||||||
@@ -295,21 +217,24 @@
|
|||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/HealthMonitor.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/HealthMonitor.scala`
|
||||||
- class HealthMonitor
|
- class HealthMonitor
|
||||||
- function setRedisPrefix
|
- function setRedisPrefix
|
||||||
|
- function initializeMetrics
|
||||||
|
- function onStartup
|
||||||
|
- function periodicHealthCheck
|
||||||
- function checkInstanceHealth
|
- function checkInstanceHealth
|
||||||
- function watchK8sPods
|
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/InstanceRegistry.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/InstanceRegistry.scala`
|
||||||
- class InstanceRegistry
|
- class InstanceRegistry
|
||||||
|
- function initMetrics
|
||||||
- function setRedisPrefix
|
- function setRedisPrefix
|
||||||
|
- function loadAllFromRedis
|
||||||
- function getInstance
|
- function getInstance
|
||||||
- function getAllInstances
|
- function getAllInstances
|
||||||
- function updateInstanceFromRedis
|
- _...4 more_
|
||||||
- function markInstanceDead
|
|
||||||
- _...1 more_
|
|
||||||
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/LoadBalancer.scala`
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/LoadBalancer.scala`
|
||||||
- class LoadBalancer
|
- class LoadBalancer
|
||||||
- function setRedisPrefix
|
- function setRedisPrefix
|
||||||
- function shouldRebalance
|
- function shouldRebalance
|
||||||
- function rebalance
|
- function rebalance
|
||||||
|
- function periodicRebalanceCheck
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala`
|
||||||
- class RuleSetRestAdapter
|
- class RuleSetRestAdapter
|
||||||
- function candidateMoves
|
- function candidateMoves
|
||||||
@@ -337,10 +262,6 @@
|
|||||||
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
|
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/config/RedissonProducer.scala`
|
|
||||||
- class RedissonProducer
|
|
||||||
- function produceRedissonClient
|
|
||||||
- function shutdown
|
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
|
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
|
||||||
- class GameEngine
|
- class GameEngine
|
||||||
@@ -356,14 +277,7 @@
|
|||||||
- class BadRequestException
|
- class BadRequestException
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
|
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
|
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala` — class CoreProtoMapper
|
||||||
- class CoreProtoMapper
|
|
||||||
- function toProtoColor
|
|
||||||
- function fromProtoColor
|
|
||||||
- function toProtoPieceType
|
|
||||||
- function fromProtoPieceType
|
|
||||||
- function toProtoMoveKind
|
|
||||||
- _...9 more_
|
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
|
||||||
- class IoGrpcClientWrapper
|
- class IoGrpcClientWrapper
|
||||||
- function exportCombined
|
- function exportCombined
|
||||||
@@ -388,15 +302,18 @@
|
|||||||
- function unsubscribe
|
- function unsubscribe
|
||||||
- _...1 more_
|
- _...1 more_
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
|
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala` — class GameRedisPublisher, function onGameEvent
|
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala`
|
||||||
|
- class GameRedisPublisher
|
||||||
|
- class GameRedisPublisher
|
||||||
|
- function onGameEvent
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
|
||||||
- class GameRedisSubscriberManager
|
- class GameRedisSubscriberManager
|
||||||
- function subscribeGame
|
- function subscribeGame
|
||||||
- function onMessage
|
|
||||||
- function unsubscribeGame
|
- function unsubscribeGame
|
||||||
- function batchResubscribeGames
|
- function batchResubscribeGames
|
||||||
- function unsubscribeGames
|
- function unsubscribeGames
|
||||||
- _...3 more_
|
- function evictGames
|
||||||
|
- _...2 more_
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
|
||||||
- class GameRegistry
|
- class GameRegistry
|
||||||
- function store
|
- function store
|
||||||
@@ -405,6 +322,7 @@
|
|||||||
- function generateId
|
- function generateId
|
||||||
- `modules/core/src/main/scala/de/nowchess/chess/registry/RedisGameRegistry.scala`
|
- `modules/core/src/main/scala/de/nowchess/chess/registry/RedisGameRegistry.scala`
|
||||||
- class RedisGameRegistry
|
- class RedisGameRegistry
|
||||||
|
- function initMetrics
|
||||||
- function generateId
|
- function generateId
|
||||||
- function store
|
- function store
|
||||||
- function get
|
- function get
|
||||||
@@ -462,14 +380,7 @@
|
|||||||
- function importGameContext
|
- function importGameContext
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
|
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
|
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala`
|
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala` — class IoProtoMapper
|
||||||
- class IoProtoMapper
|
|
||||||
- function toProtoColor
|
|
||||||
- function fromProtoColor
|
|
||||||
- function toProtoPieceType
|
|
||||||
- function fromProtoPieceType
|
|
||||||
- function toProtoMoveKind
|
|
||||||
- _...9 more_
|
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
|
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
|
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
|
||||||
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
|
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
|
||||||
@@ -500,16 +411,127 @@
|
|||||||
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
|
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
|
||||||
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
|
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
|
||||||
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
|
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
|
||||||
|
- `modules/official-bots/python/nnue.py`
|
||||||
|
- function get_weights_dir: ()
|
||||||
|
- function get_data_dir: ()
|
||||||
|
- function list_checkpoints: ()
|
||||||
|
- function migrate_legacy_data: ()
|
||||||
|
- function show_header: ()
|
||||||
|
- function show_checkpoints_table: ()
|
||||||
|
- _...10 more_
|
||||||
|
- `modules/official-bots/python/src/dataset.py`
|
||||||
|
- function get_datasets_dir: () -> Path
|
||||||
|
- function next_dataset_version: () -> int
|
||||||
|
- function list_datasets: () -> List[Tuple[int, Dict]]
|
||||||
|
- function load_dataset_metadata: (version) -> Optional[Dict]
|
||||||
|
- function save_dataset_metadata: (version, metadata) -> None
|
||||||
|
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
|
||||||
|
- _...4 more_
|
||||||
|
- `modules/official-bots/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
|
||||||
|
- `modules/official-bots/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
|
||||||
|
- `modules/official-bots/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
|
||||||
|
- `modules/official-bots/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
|
||||||
|
- `modules/official-bots/python/src/tactical_positions_extractor.py`
|
||||||
|
- function download_and_extract_puzzle_db: (url, output_dir)
|
||||||
|
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
|
||||||
|
- function load_positions_from_file: (file_path) -> Set[str]
|
||||||
|
- function merge_positions: (tactical, other, output_file)
|
||||||
|
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
|
||||||
|
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
|
||||||
|
- `modules/official-bots/python/src/train.py`
|
||||||
|
- function fen_to_features: (fen)
|
||||||
|
- function find_next_version: (base_name)
|
||||||
|
- function save_metadata: (weights_file, metadata)
|
||||||
|
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
|
||||||
|
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
|
||||||
|
- class NNUEDataset
|
||||||
|
- _...1 more_
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotController.scala`
|
||||||
|
- class BotController
|
||||||
|
- function getBot
|
||||||
|
- function listBots
|
||||||
|
- class BotController
|
||||||
|
- function getBot
|
||||||
|
- function listBots
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
|
||||||
|
- class BotMoveRepetition
|
||||||
|
- function blockedMoves
|
||||||
|
- function repeatedMove
|
||||||
|
- function filterAllowed
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/Config.scala` — class Config
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
|
||||||
|
- class Evaluation
|
||||||
|
- class CHECKMATE_SCORE
|
||||||
|
- class DRAW_SCORE
|
||||||
|
- function evaluate
|
||||||
|
- function initAccumulator
|
||||||
|
- function copyAccumulator
|
||||||
|
- _...2 more_
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala` — class ClassicalBot, function apply
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/HybridBot.scala` — class HybridBot, function apply
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala` — class NNUEBot, function apply
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
|
||||||
|
- class EvaluationClassic
|
||||||
|
- function evaluate
|
||||||
|
- function countRay
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
|
||||||
|
- class NNUE
|
||||||
|
- function initAccumulator
|
||||||
|
- function pushAccumulator
|
||||||
|
- function copyAccumulator
|
||||||
|
- function recomputeAccumulator
|
||||||
|
- function validateAccumulator
|
||||||
|
- _...4 more_
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
|
||||||
|
- class NbaiLoader
|
||||||
|
- function load
|
||||||
|
- function loadDefault
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
|
||||||
|
- function toJson
|
||||||
|
- class NbaiMetadata
|
||||||
|
- function fromJson
|
||||||
|
- function str
|
||||||
|
- function num
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/config/RedisConfig.scala` — class RedisConfig
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
|
||||||
|
- function bestMove
|
||||||
|
- function bestMove
|
||||||
|
- function bestMoveWithTime
|
||||||
|
- function bestMoveWithTime
|
||||||
|
- function loop
|
||||||
|
- function loop
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
|
||||||
|
- class MoveOrdering
|
||||||
|
- class OrderingContext
|
||||||
|
- function addKillerMove
|
||||||
|
- function getKillerMoves
|
||||||
|
- function addHistory
|
||||||
|
- function getHistory
|
||||||
|
- _...3 more_
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
|
||||||
|
- function advance
|
||||||
|
- function probe
|
||||||
|
- function store
|
||||||
|
- function clear
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/resource/OfficialBotChallengeResource.scala` — class OfficialBotChallengeResource, function challengeWithDifficulty
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/DifficultyMapper.scala` — class DifficultyMapper, function fromElo
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/service/OfficialBotService.scala`
|
||||||
|
- class OfficialBotService
|
||||||
|
- function initializeMetrics
|
||||||
|
- function onStart
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
|
||||||
|
- `modules/official-bots/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
|
||||||
|
- class ZobristHash
|
||||||
|
- function hash
|
||||||
|
- function nextHash
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala`
|
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala` — class ProtoMapper
|
||||||
- class ProtoMapper
|
|
||||||
- function toProtoColor
|
|
||||||
- function fromProtoColor
|
|
||||||
- function toProtoPieceType
|
|
||||||
- function fromProtoPieceType
|
|
||||||
- function toProtoMoveKind
|
|
||||||
- _...9 more_
|
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
|
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
|
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
|
||||||
- class RuleSetResource
|
- class RuleSetResource
|
||||||
@@ -520,35 +542,42 @@
|
|||||||
- function isCheckmate
|
- function isCheckmate
|
||||||
- _...6 more_
|
- _...6 more_
|
||||||
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
|
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalAuthFilter.scala` — class InternalAuthFilter
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalClientHeadersFactory.scala` — class InternalClientHeadersFactory
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalGrpcAuthInterceptor.scala` — class InternalGrpcAuthInterceptor
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalGrpcSecretClientInterceptor.scala` — class InternalGrpcSecretClientInterceptor
|
||||||
|
- `modules/security/src/main/scala/de/nowchess/security/InternalSecretClientFilter.scala` — class InternalSecretClientFilter
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
|
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/config/RedissonProducer.scala`
|
|
||||||
- class RedissonProducer
|
|
||||||
- function redissonClient
|
|
||||||
- function close
|
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
|
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala`
|
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala` — class GameWritebackStreamListener, function startListening
|
||||||
- class GameWritebackStreamListener
|
|
||||||
- function startListening
|
|
||||||
- function onMessage
|
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
|
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
|
||||||
- class GameRecordRepository
|
- class GameRecordRepository
|
||||||
- function findByGameId
|
- function findByGameId
|
||||||
- function persist
|
- function persist
|
||||||
- function merge
|
- function merge
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala` — class StoreGameResource, function getGame
|
- function findByPlayerId
|
||||||
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack
|
- function findByPlayerIdRunning
|
||||||
|
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala`
|
||||||
|
- class StoreGameResource
|
||||||
|
- function getGame
|
||||||
|
- function getRunning
|
||||||
|
- function getHistory
|
||||||
|
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala`
|
||||||
|
- class GameWritebackService
|
||||||
|
- function initializeMetrics
|
||||||
|
- function writeBack
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
|
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedissonProducer.scala`
|
|
||||||
- class RedissonProducer
|
|
||||||
- function produceRedissonClient
|
|
||||||
- function shutdown
|
|
||||||
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
|
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
|
||||||
- class GameWebSocketResource
|
- class GameWebSocketResource
|
||||||
|
- function initializeMetrics
|
||||||
- function onOpen
|
- function onOpen
|
||||||
- function onMessage
|
|
||||||
- function onTextMessage
|
- function onTextMessage
|
||||||
- function onClose
|
- function onClose
|
||||||
|
- `modules/ws/src/main/scala/de/nowchess/ws/resource/UserWebSocketResource.scala`
|
||||||
|
- class UserWebSocketResource
|
||||||
|
- function onOpen
|
||||||
|
- function onClose
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Middleware
|
# Middleware
|
||||||
|
|
||||||
## custom
|
## custom
|
||||||
- generate — `modules/bot/python/src/generate.py`
|
- generate — `modules/official-bots/python/src/generate.py`
|
||||||
|
|||||||
@@ -19,12 +19,20 @@ jobs:
|
|||||||
- id: check
|
- id: check
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
||||||
|
echo "Triggered manually — allowing build"
|
||||||
echo "allowed=true" >> "$GITHUB_OUTPUT"
|
echo "allowed=true" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
COMMIT_AUTHOR=$(git log -1 --format='%an')
|
COMMIT_AUTHOR=$(git log -1 --format='%an')
|
||||||
|
COMMIT_SHA=$(git log -1 --format='%H')
|
||||||
|
COMMIT_MSG=$(git log -1 --format='%s')
|
||||||
|
echo "Commit: ${COMMIT_SHA}"
|
||||||
|
echo "Author: ${COMMIT_AUTHOR}"
|
||||||
|
echo "Message: ${COMMIT_MSG}"
|
||||||
if [[ "$COMMIT_AUTHOR" == "TeamCity" ]]; then
|
if [[ "$COMMIT_AUTHOR" == "TeamCity" ]]; then
|
||||||
|
echo "Author is TeamCity — allowing build"
|
||||||
echo "allowed=true" >> "$GITHUB_OUTPUT"
|
echo "allowed=true" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
|
echo "Author is not TeamCity — skipping build"
|
||||||
echo "allowed=false" >> "$GITHUB_OUTPUT"
|
echo "allowed=false" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -49,11 +57,50 @@ jobs:
|
|||||||
- rule
|
- rule
|
||||||
- store
|
- store
|
||||||
- ws
|
- ws
|
||||||
|
arch:
|
||||||
|
- name: default
|
||||||
|
march_flag: ""
|
||||||
|
tag_suffix: ""
|
||||||
|
- name: x86_v2
|
||||||
|
march_flag: "-march=x86-64-v2"
|
||||||
|
tag_suffix: "-x86_v2"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Read version from versions.env
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
if [ -f "modules/${{ matrix.module }}/versions.env" ]; then
|
||||||
|
source modules/${{ matrix.module }}/versions.env
|
||||||
|
VERSION="${MAJOR}.${MINOR}.${PATCH}${{ matrix.arch.tag_suffix }}"
|
||||||
|
echo "[${{ matrix.module }}/${{ matrix.arch.name }}] Version: ${VERSION}"
|
||||||
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
else
|
||||||
|
echo "[${{ matrix.module }}/${{ matrix.arch.name }}] No versions.env found — using 'latest${{ matrix.arch.tag_suffix }}'"
|
||||||
|
echo "version=latest${{ matrix.arch.tag_suffix }}" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Check if image exists in GHCR
|
||||||
|
id: image-check
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
PACKAGE="now-chess-systems%2F${{ matrix.module }}"
|
||||||
|
VERSION="${{ steps.version.outputs.version }}"
|
||||||
|
EXISTING_TAGS=$(gh api "orgs/now-chess/packages/container/${PACKAGE}/versions" \
|
||||||
|
--jq '.[].metadata.container.tags[]' 2>/dev/null || echo "")
|
||||||
|
echo "[${{ matrix.module }}/${{ matrix.arch.name }}] Existing tags: $(echo "${EXISTING_TAGS}" | tr '\n' ' ' | xargs)"
|
||||||
|
if echo "${EXISTING_TAGS}" | grep -qx "${VERSION}"; then
|
||||||
|
echo "[${{ matrix.module }}/${{ matrix.arch.name }}] Image ${VERSION} already exists — skipping build"
|
||||||
|
echo "exists=true" >> "$GITHUB_OUTPUT"
|
||||||
|
else
|
||||||
|
echo "[${{ matrix.module }}/${{ matrix.arch.name }}] Image ${VERSION} not found — will build"
|
||||||
|
echo "exists=false" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Set up GraalVM
|
- name: Set up GraalVM
|
||||||
|
if: steps.image-check.outputs.exists == 'false'
|
||||||
uses: graalvm/setup-graalvm@v1
|
uses: graalvm/setup-graalvm@v1
|
||||||
with:
|
with:
|
||||||
java-version: '21'
|
java-version: '21'
|
||||||
@@ -61,6 +108,7 @@ jobs:
|
|||||||
native-image-job-reports: 'true'
|
native-image-job-reports: 'true'
|
||||||
|
|
||||||
- name: Cache Gradle packages
|
- name: Cache Gradle packages
|
||||||
|
if: steps.image-check.outputs.exists == 'false'
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
@@ -69,24 +117,22 @@ jobs:
|
|||||||
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
restore-keys: gradle-${{ runner.os }}-
|
restore-keys: gradle-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Read version from versions.env
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
if [ -f "modules/${{ matrix.module }}/versions.env" ]; then
|
|
||||||
source modules/${{ matrix.module }}/versions.env
|
|
||||||
VERSION="${MAJOR}.${MINOR}.${PATCH}"
|
|
||||||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
|
||||||
else
|
|
||||||
echo "version=latest" >> "$GITHUB_OUTPUT"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Build native binary
|
- name: Build native binary
|
||||||
run: ./gradlew :modules:${{ matrix.module }}:build -x test -Dquarkus.native.enabled=true -Dquarkus.package.jar.enabled=false -Dquarkus.profile=deployed --no-daemon
|
if: steps.image-check.outputs.exists == 'false'
|
||||||
|
run: |
|
||||||
|
MARCH="${{ matrix.arch.march_flag }}"
|
||||||
|
MARCH_ARG=""
|
||||||
|
if [ -n "$MARCH" ]; then
|
||||||
|
MARCH_ARG="-Dquarkus.native.additional-build-args=$MARCH"
|
||||||
|
fi
|
||||||
|
./gradlew :modules:${{ matrix.module }}:build -x test -Dquarkus.native.enabled=true -Dquarkus.package.jar.enabled=false -Dquarkus.profile=deployed $MARCH_ARG --no-daemon
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
|
if: steps.image-check.outputs.exists == 'false'
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Log in to GitHub Container Registry
|
- name: Log in to GitHub Container Registry
|
||||||
|
if: steps.image-check.outputs.exists == 'false'
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
@@ -94,15 +140,17 @@ jobs:
|
|||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Extract metadata
|
- name: Extract metadata
|
||||||
|
if: steps.image-check.outputs.exists == 'false'
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v5
|
||||||
with:
|
with:
|
||||||
images: ghcr.io/now-chess/now-chess-systems/${{ matrix.module }}
|
images: ghcr.io/now-chess/now-chess-systems/${{ matrix.module }}
|
||||||
tags: |
|
tags: |
|
||||||
type=raw,value=${{ steps.version.outputs.version }}
|
type=raw,value=${{ steps.version.outputs.version }}
|
||||||
type=raw,value=latest
|
type=raw,value=latest${{ matrix.arch.tag_suffix }}
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
|
if: steps.image-check.outputs.exists == 'false'
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
@@ -110,5 +158,5 @@ jobs:
|
|||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
cache-from: type=gha,scope=${{ matrix.module }}
|
cache-from: type=gha,scope=${{ matrix.module }}-${{ matrix.arch.name }}
|
||||||
cache-to: type=gha,mode=max,scope=${{ matrix.module }}
|
cache-to: type=gha,mode=max,scope=${{ matrix.module }}-${{ matrix.arch.name }}
|
||||||
|
|||||||
@@ -48,3 +48,9 @@ graphify-out/
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
/jacoco-reporter/.venv/
|
/jacoco-reporter/.venv/
|
||||||
/.claude/settings.local.json
|
/.claude/settings.local.json
|
||||||
|
/.claude/worktrees/
|
||||||
|
modules/tournament/src/main/resources/keys/dev-public.pem
|
||||||
|
modules/account/src/main/resources/keys/dev-private.pem
|
||||||
|
modules/account/src/main/resources/keys/dev-public.pem
|
||||||
|
modules/core/src/main/resources/keys/dev-public.pem
|
||||||
|
*.hprof
|
||||||
|
|||||||
Generated
-19
@@ -5,25 +5,6 @@
|
|||||||
<option name="linkedExternalProjectsSettings">
|
<option name="linkedExternalProjectsSettings">
|
||||||
<GradleProjectSettings>
|
<GradleProjectSettings>
|
||||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
<option name="gradleJvm" value="ms-21" />
|
|
||||||
<option name="modules">
|
|
||||||
<set>
|
|
||||||
<option value="$PROJECT_DIR$" />
|
|
||||||
<option value="$PROJECT_DIR$/modules" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/account" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/api" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/bot-platform" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/coordinator" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/core" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/io" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/json" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/official-bots" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/rule" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/security" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/store" />
|
|
||||||
<option value="$PROJECT_DIR$/modules/ws" />
|
|
||||||
</set>
|
|
||||||
</option>
|
|
||||||
</GradleProjectSettings>
|
</GradleProjectSettings>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
Generated
-1
@@ -1,4 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="FrameworkDetectionExcludesConfiguration">
|
<component name="FrameworkDetectionExcludesConfiguration">
|
||||||
|
|||||||
Generated
-6
@@ -1,11 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="CommitMessageInspectionProfile">
|
|
||||||
<profile version="1.0">
|
|
||||||
<inspection_tool class="CommitFormat" enabled="true" level="WARNING" enabled_by_default="true" />
|
|
||||||
<inspection_tool class="CommitNamingConvention" enabled="true" level="WARNING" enabled_by_default="true" />
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
||||||
<component name="IssueNavigationConfiguration">
|
<component name="IssueNavigationConfiguration">
|
||||||
<option name="links">
|
<option name="links">
|
||||||
<list>
|
<list>
|
||||||
|
|||||||
@@ -57,6 +57,14 @@ Use consistently.
|
|||||||
- **Tests are the spec.** Don't modify to pass. Fix requirements/code. Update only if requirements change.
|
- **Tests are the spec.** Don't modify to pass. Fix requirements/code. Update only if requirements change.
|
||||||
- Never read build folders. Ask permission if needed.
|
- Never read build folders. Ask permission if needed.
|
||||||
- Keep file current with decisions + conventions.
|
- Keep file current with decisions + conventions.
|
||||||
|
- **NativeReflectionConfig (mandatory):** Every new type (class, case class, enum, sealed trait — anything serialized) must be registered in the `NativeReflectionConfig` of **every module that interacts with it**. Configs live at:
|
||||||
|
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala`
|
||||||
|
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala`
|
||||||
|
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`
|
||||||
|
- `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala`
|
||||||
|
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala`
|
||||||
|
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala`
|
||||||
|
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ meta {
|
|||||||
seq: 1
|
seq: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/account
|
url: {{accountBaseUrl}}/account
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ meta {
|
|||||||
seq: 2
|
seq: 2
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/account/login
|
url: {{accountBaseUrl}}/account/login
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -7,7 +7,12 @@ meta {
|
|||||||
get {
|
get {
|
||||||
url: {{accountBaseUrl}}/account/me
|
url: {{accountBaseUrl}}/account/me
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 4
|
seq: 4
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
get {
|
||||||
method: GET
|
|
||||||
url: {{accountBaseUrl}}/account/{{username}}
|
url: {{accountBaseUrl}}/account/{{username}}
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ meta {
|
|||||||
seq: 5
|
seq: 5
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/account/bots
|
url: {{accountBaseUrl}}/account/bots
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -7,7 +7,12 @@ meta {
|
|||||||
get {
|
get {
|
||||||
url: {{accountBaseUrl}}/account/bots
|
url: {{accountBaseUrl}}/account/bots
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ meta {
|
|||||||
seq: 7
|
seq: 7
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
put {
|
||||||
method: PUT
|
|
||||||
url: {{accountBaseUrl}}/account/bots/{{botId}}
|
url: {{accountBaseUrl}}/account/bots/{{botId}}
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 8
|
seq: 8
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/account/bots/{{botId}}/rotate-token
|
url: {{accountBaseUrl}}/account/bots/{{botId}}/rotate-token
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 9
|
seq: 9
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
delete {
|
||||||
method: DELETE
|
|
||||||
url: {{accountBaseUrl}}/account/bots/{{botId}}
|
url: {{accountBaseUrl}}/account/bots/{{botId}}
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 10
|
seq: 10
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
get {
|
||||||
method: GET
|
|
||||||
url: {{accountBaseUrl}}/account/official-bots
|
url: {{accountBaseUrl}}/account/official-bots
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 11
|
seq: 11
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/account/{{userId}}/ban
|
url: {{accountBaseUrl}}/account/{{userId}}/ban
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 12
|
seq: 12
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/account/{{userId}}/unban
|
url: {{accountBaseUrl}}/account/{{userId}}/unban
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,11 +4,10 @@ meta {
|
|||||||
seq: 1
|
seq: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/challenge/{{username}}
|
url: {{accountBaseUrl}}/challenge/{{username}}
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
@@ -18,9 +17,20 @@ headers {
|
|||||||
|
|
||||||
body:json {
|
body:json {
|
||||||
{
|
{
|
||||||
|
"color": "random",
|
||||||
"timeControl": {
|
"timeControl": {
|
||||||
"limitSeconds": 600,
|
"limitSeconds": 600,
|
||||||
"incrementSeconds": 5
|
"incrementSeconds": 5
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vars:pre-request {
|
||||||
|
username: bdc
|
||||||
|
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJub3djaGVzcyIsInN1YiI6ImY3MGQxNDIwLTdhZmEtNGVjMy05Mzg1LWViYWU0N2U3NGY4OCIsInVzZXJuYW1lIjoicGxheWVyMSIsImlhdCI6MTc3OTE5MjkwOCwiZXhwIjoxNzc5MTkzMjA4LCJqdGkiOiJkMDhlZmRhMi01ZjliLTQyNjgtOGM3MC1iNDA2OTViNDhiMTUifQ.q68R2bUdRQ5QwEIfcP0d2g_Wac94qd4K6BzP-PC94x-tDpT3leUY8ZpqY6YzoNv-ywp5sm47-WC539DyUqdzDgPVLLSmOMjRxG-HpaNdXwsXlp8_C7KGlgkK_XSMa3Gq6S4AfUbaXbRhPg5NZz2MRosu0BY2ed0ISvmEfX5XEdBRlKgD14BIKAsEFv3tHtarFS1RGpcSoHV2oeIk_m-VHUC78N-ciNHmBH6mZna_fVHgMocOIrEsTZuUms0Zacmebvh2tAcf36xux1Bm2awJff19zReD-A2o9jucrKcM3Im5BJ6JtuWAsHEae9KLmuol6S2pldvNOmUn3egFUYz0yQ
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,7 +7,12 @@ meta {
|
|||||||
get {
|
get {
|
||||||
url: {{accountBaseUrl}}/challenge
|
url: {{accountBaseUrl}}/challenge
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 3
|
seq: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
get {
|
||||||
method: GET
|
|
||||||
url: {{accountBaseUrl}}/challenge/{{challengeId}}
|
url: {{accountBaseUrl}}/challenge/{{challengeId}}
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 4
|
seq: 4
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/challenge/{{challengeId}}/accept
|
url: {{accountBaseUrl}}/challenge/{{challengeId}}/accept
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ meta {
|
|||||||
seq: 5
|
seq: 5
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/challenge/{{challengeId}}/decline
|
url: {{accountBaseUrl}}/challenge/{{challengeId}}/decline
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 6
|
seq: 6
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/challenge/{{challengeId}}/cancel
|
url: {{accountBaseUrl}}/challenge/{{challengeId}}/cancel
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 1
|
seq: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/challenge/official/{{botName}}?difficulty={{difficulty}}&color={{color}}
|
url: {{accountBaseUrl}}/challenge/official/{{botName}}?difficulty={{difficulty}}&color={{color}}
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
@@ -15,7 +20,7 @@ headers {
|
|||||||
Accept: application/json
|
Accept: application/json
|
||||||
}
|
}
|
||||||
|
|
||||||
notes {
|
docs {
|
||||||
Query Parameters:
|
Query Parameters:
|
||||||
- difficulty: 1000-2800 (ELO)
|
- difficulty: 1000-2800 (ELO)
|
||||||
- color: white | black | random
|
- color: white | black | random
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ meta {
|
|||||||
seq: 2
|
seq: 2
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{accountBaseUrl}}/account/official-bots
|
url: {{accountBaseUrl}}/account/official-bots
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,10 +4,15 @@ meta {
|
|||||||
seq: 3
|
seq: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
delete {
|
||||||
method: DELETE
|
|
||||||
url: {{accountBaseUrl}}/account/official-bots/{{botId}}
|
url: {{accountBaseUrl}}/account/official-bots/{{botId}}
|
||||||
auth: none
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -4,9 +4,13 @@ meta {
|
|||||||
seq: 1
|
seq: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/offer
|
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/offer
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,13 @@ meta {
|
|||||||
seq: 2
|
seq: 2
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/accept
|
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/accept
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,13 @@ meta {
|
|||||||
seq: 3
|
seq: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/decline
|
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/decline
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,13 @@ meta {
|
|||||||
seq: 4
|
seq: 4
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/claim
|
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/claim
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,13 @@ meta {
|
|||||||
seq: 1
|
seq: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
get {
|
||||||
method: GET
|
|
||||||
url: {{baseUrl}}/api/board/game/{{gameId}}/export/fen
|
url: {{baseUrl}}/api/board/game/{{gameId}}/export/fen
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,13 @@ meta {
|
|||||||
seq: 2
|
seq: 2
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
get {
|
||||||
method: GET
|
|
||||||
url: {{baseUrl}}/api/board/game/{{gameId}}/export/pgn
|
url: {{baseUrl}}/api/board/game/{{gameId}}/export/pgn
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ meta {
|
|||||||
seq: 1
|
seq: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/api/board/game
|
url: {{baseUrl}}/api/board/game
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -7,7 +7,12 @@ meta {
|
|||||||
get {
|
get {
|
||||||
url: {{baseUrl}}/api/board/game/{{gameId}}
|
url: {{baseUrl}}/api/board/game/{{gameId}}
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
vars:pre-request {
|
vars:pre-request {
|
||||||
|
|||||||
@@ -4,9 +4,13 @@ meta {
|
|||||||
seq: 4
|
seq: 4
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/api/board/game/{{gameId}}/resign
|
url: {{baseUrl}}/api/board/game/{{gameId}}/resign
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ meta {
|
|||||||
seq: 1
|
seq: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
http {
|
post {
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/api/board/game/import/fen
|
url: {{baseUrl}}/api/board/game/import/fen
|
||||||
body: json
|
body: json
|
||||||
auth: none
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
headers {
|
headers {
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
meta {
|
||||||
|
name: List Instances
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{coordinatorBaseUrl}}/api/coordinator/instances
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
Returns all known core instances from the in-memory registry.
|
||||||
|
Registry is populated via gRPC heartbeats from core instances.
|
||||||
|
|
||||||
|
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
|
||||||
|
|
||||||
|
Response: InstanceMetadata[]
|
||||||
|
instanceId: string — unique instance ID
|
||||||
|
hostname: string
|
||||||
|
httpPort: int
|
||||||
|
grpcPort: int
|
||||||
|
subscriptionCount: int — active game subscriptions
|
||||||
|
localCacheSize: int
|
||||||
|
lastHeartbeat: string — ISO-8601 timestamp
|
||||||
|
state: string — "HEALTHY" | "DEAD"
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
meta {
|
||||||
|
name: List Instances
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
method: GET
|
||||||
|
url: {{coordinatorBaseUrl}}/api/coordinator/instances
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
Accept: application/json
|
||||||
|
}
|
||||||
|
|
||||||
|
notes {
|
||||||
|
Returns all known core instances from the in-memory registry.
|
||||||
|
Registry is populated via gRPC heartbeats from core instances.
|
||||||
|
|
||||||
|
Response: InstanceMetadata[]
|
||||||
|
instanceId: string — unique instance ID
|
||||||
|
hostname: string
|
||||||
|
httpPort: int
|
||||||
|
grpcPort: int
|
||||||
|
subscriptionCount: int — number of active game subscriptions
|
||||||
|
localCacheSize: int
|
||||||
|
lastHeartbeat: string — ISO-8601 timestamp
|
||||||
|
state: string — "HEALTHY" | "DEAD"
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Metrics
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{coordinatorBaseUrl}}/api/coordinator/metrics
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
Aggregate load metrics computed from the instance registry.
|
||||||
|
|
||||||
|
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
|
||||||
|
|
||||||
|
Response: MetricsDto
|
||||||
|
totalInstances: int
|
||||||
|
healthyInstances: int
|
||||||
|
deadInstances: int
|
||||||
|
totalGames: int — sum of subscriptionCount across all instances
|
||||||
|
avgGamesPerCore: double
|
||||||
|
maxGamesPerCore: int
|
||||||
|
minGamesPerCore: int
|
||||||
|
instances: InstanceMetadata[]
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
meta {
|
||||||
|
name: Rebalance
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{coordinatorBaseUrl}}/api/coordinator/rebalance
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
Triggers a manual rebalance of game subscriptions across core instances.
|
||||||
|
Runs asynchronously — response does not wait for completion.
|
||||||
|
|
||||||
|
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
|
||||||
|
|
||||||
|
Auto-rebalance runs every 30s (rebalance-interval), min 60s between runs
|
||||||
|
(rebalance-min-interval). Triggers when load deviation exceeds 20%
|
||||||
|
(max-deviation-percent).
|
||||||
|
|
||||||
|
Response: {"status": "rebalance_started"}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
meta {
|
||||||
|
name: Failover
|
||||||
|
type: http
|
||||||
|
seq: 4
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{coordinatorBaseUrl}}/api/coordinator/failover/{{instanceId}}
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
vars:pre-request {
|
||||||
|
instanceId: core-instance-1
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
Triggers manual failover for a specific core instance.
|
||||||
|
Marks it DEAD and migrates its game subscriptions to healthy instances.
|
||||||
|
Runs asynchronously — response does not wait for completion.
|
||||||
|
|
||||||
|
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
|
||||||
|
|
||||||
|
Path param: instanceId — from /instances response (instanceId field)
|
||||||
|
|
||||||
|
Response: {"status": "failover_started", "instanceId": "<id>"}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
meta {
|
||||||
|
name: Scale Up
|
||||||
|
type: http
|
||||||
|
seq: 5
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{coordinatorBaseUrl}}/api/coordinator/scale-up
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
Triggers manual scale-up of core replicas via Kubernetes rollout.
|
||||||
|
Requires auto-scale-enabled=true and a reachable k8s API.
|
||||||
|
Respects scale-max-replicas (default: 10).
|
||||||
|
|
||||||
|
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
|
||||||
|
|
||||||
|
Auto-scale triggers when avg load exceeds scale-up-threshold (default: 0.8).
|
||||||
|
|
||||||
|
Response: {"status": "scale_up_started"}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
meta {
|
||||||
|
name: Scale Down
|
||||||
|
type: http
|
||||||
|
seq: 6
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{coordinatorBaseUrl}}/api/coordinator/scale-down
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
Triggers manual scale-down of core replicas via Kubernetes rollout.
|
||||||
|
Requires auto-scale-enabled=true and a reachable k8s API.
|
||||||
|
Respects scale-min-replicas (default: 2).
|
||||||
|
|
||||||
|
Requires port-forward: kubectl port-forward svc/nowchess-coordinator 8086:8086 -n <namespace>
|
||||||
|
|
||||||
|
Auto-scale triggers when avg load drops below scale-down-threshold (default: 0.3).
|
||||||
|
|
||||||
|
Response: {"status": "scale_down_started"}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
meta {
|
||||||
|
name: List Instances
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{coordinatorBaseUrl}}/api/coordinator/instances
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
Returns all known core instances from the in-memory registry.
|
||||||
|
Registry is populated via gRPC heartbeats from core instances.
|
||||||
|
|
||||||
|
Response: InstanceMetadata[]
|
||||||
|
instanceId: string — unique instance ID
|
||||||
|
hostname: string
|
||||||
|
httpPort: int
|
||||||
|
grpcPort: int
|
||||||
|
subscriptionCount: int — number of active game subscriptions
|
||||||
|
localCacheSize: int
|
||||||
|
lastHeartbeat: string — ISO-8601 timestamp
|
||||||
|
state: string — "HEALTHY" | "DEAD"
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
meta {
|
meta {
|
||||||
name: coordinator
|
name: coordinator
|
||||||
seq: 4
|
seq: 6
|
||||||
}
|
}
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: List Instances
|
|
||||||
type: http
|
|
||||||
seq: 1
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
method: GET
|
|
||||||
url: {{baseUrl}}/coordinator/instances
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
headers {
|
|
||||||
Accept: application/json
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: Get Metrics
|
|
||||||
type: http
|
|
||||||
seq: 2
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
method: GET
|
|
||||||
url: {{baseUrl}}/coordinator/metrics
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
headers {
|
|
||||||
Accept: application/json
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: Rebalance
|
|
||||||
type: http
|
|
||||||
seq: 3
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/coordinator/rebalance
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
headers {
|
|
||||||
Accept: application/json
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: Failover
|
|
||||||
type: http
|
|
||||||
seq: 4
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/coordinator/failover/{{instanceId}}
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
headers {
|
|
||||||
Accept: application/json
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: Scale Up
|
|
||||||
type: http
|
|
||||||
seq: 5
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/coordinator/scale-up
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
headers {
|
|
||||||
Accept: application/json
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: Scale Down
|
|
||||||
type: http
|
|
||||||
seq: 6
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
method: POST
|
|
||||||
url: {{baseUrl}}/coordinator/scale-down
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
headers {
|
|
||||||
Accept: application/json
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
vars {
|
vars {
|
||||||
baseUrl: http://localhost:8080
|
baseUrl: http://localhost:8080/api
|
||||||
wsBaseUrl: ws://localhost:8084
|
wsBaseUrl: ws://localhost:8084
|
||||||
ioBaseUrl: http://localhost:8080
|
ioBaseUrl: http://localhost:8080/api
|
||||||
accountBaseUrl: http://localhost:8083/api
|
accountBaseUrl: http://localhost:8083/api
|
||||||
storeBaseUrl: http://localhost:8085
|
storeBaseUrl: http://localhost:8085
|
||||||
|
coordinatorBaseUrl: http://localhost:8086
|
||||||
token: your_jwt_token_here
|
token: your_jwt_token_here
|
||||||
adminToken: your_admin_jwt_token_here
|
adminToken: your_admin_jwt_token_here
|
||||||
botToken: your_bot_jwt_token_here
|
botToken: your_bot_jwt_token_here
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ vars {
|
|||||||
ioBaseUrl: https://nowchess.janis-eccarius.de/api
|
ioBaseUrl: https://nowchess.janis-eccarius.de/api
|
||||||
accountBaseUrl: https://nowchess.janis-eccarius.de/api
|
accountBaseUrl: https://nowchess.janis-eccarius.de/api
|
||||||
storeBaseUrl: https://nowchess.janis-eccarius.de/api
|
storeBaseUrl: https://nowchess.janis-eccarius.de/api
|
||||||
|
coordinatorBaseUrl: http://localhost:8086
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ vars {
|
|||||||
ioBaseUrl: https://st.nowchess.janis-eccarius.de/api
|
ioBaseUrl: https://st.nowchess.janis-eccarius.de/api
|
||||||
accountBaseUrl: https://st.nowchess.janis-eccarius.de/api
|
accountBaseUrl: https://st.nowchess.janis-eccarius.de/api
|
||||||
storeBaseUrl: https://st.nowchess.janis-eccarius.de/api
|
storeBaseUrl: https://st.nowchess.janis-eccarius.de/api
|
||||||
|
coordinatorBaseUrl: http://localhost:8086
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: Game WebSocket
|
|
||||||
type: http
|
|
||||||
seq: 1
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
method: GET
|
|
||||||
url: {{wsBaseUrl}}/api/board/game/{{gameId}}/ws
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
headers {
|
|
||||||
Authorization: Bearer {{token}}
|
|
||||||
Connection: Upgrade
|
|
||||||
Upgrade: websocket
|
|
||||||
}
|
|
||||||
|
|
||||||
notes {
|
|
||||||
WebSocket connection for real-time game updates.
|
|
||||||
|
|
||||||
Local: ws://localhost:8084/api/board/game/{{gameId}}/ws
|
|
||||||
Staging: wss://st.nowchess.janis-eccarius.de/ws/api/board/game/{{gameId}}/ws
|
|
||||||
Prod: wss://nowchess.janis-eccarius.de/ws/api/board/game/{{gameId}}/ws
|
|
||||||
|
|
||||||
Message Types:
|
|
||||||
- CONNECTED: Connection established
|
|
||||||
- MOVE: Player move
|
|
||||||
- GAME_STATE: Full state update
|
|
||||||
- ERROR: Error message
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: User WebSocket
|
|
||||||
type: http
|
|
||||||
seq: 2
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
method: GET
|
|
||||||
url: {{wsBaseUrl}}/api/user/ws
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
headers {
|
|
||||||
Authorization: Bearer {{token}}
|
|
||||||
Connection: Upgrade
|
|
||||||
Upgrade: websocket
|
|
||||||
}
|
|
||||||
|
|
||||||
notes {
|
|
||||||
WebSocket connection for user notifications.
|
|
||||||
|
|
||||||
Local: ws://localhost:8084/api/user/ws
|
|
||||||
Staging: wss://st.nowchess.janis-eccarius.de/ws/api/user/ws
|
|
||||||
Prod: wss://nowchess.janis-eccarius.de/ws/api/user/ws
|
|
||||||
|
|
||||||
Message Types:
|
|
||||||
- CONNECTED: Connection established
|
|
||||||
- CHALLENGE: Challenge received
|
|
||||||
- GAME_INVITE: Game invitation
|
|
||||||
- NOTIFICATION: General notification
|
|
||||||
- ERROR: Error message
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
meta {
|
||||||
|
name: Game WebSocket
|
||||||
|
type: ws
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
ws {
|
||||||
|
url: {{wsBaseUrl}}/api/board/game/{{gameId}}/ws
|
||||||
|
body: ws
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
Authorization: Bearer {{token}}
|
||||||
|
}
|
||||||
|
|
||||||
|
body:ws {
|
||||||
|
name: message 1
|
||||||
|
type: json
|
||||||
|
content: '''
|
||||||
|
{}
|
||||||
|
'''
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
meta {
|
||||||
|
name: User WebSocket
|
||||||
|
type: ws
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
ws {
|
||||||
|
url: {{wsBaseUrl}}/api/user/ws
|
||||||
|
body: ws
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
Authorization: Bearer {{token}}
|
||||||
|
}
|
||||||
|
|
||||||
|
body:ws {
|
||||||
|
name: message 1
|
||||||
|
type: json
|
||||||
|
content: '''
|
||||||
|
{}
|
||||||
|
'''
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
meta {
|
||||||
|
name: ws
|
||||||
|
seq: 7
|
||||||
|
}
|
||||||
@@ -0,0 +1,623 @@
|
|||||||
|
openapi: 3.0.3
|
||||||
|
info:
|
||||||
|
title: NowChess Tournament API
|
||||||
|
description: |
|
||||||
|
Swiss-system bot tournaments, modelled after the Lichess API style.
|
||||||
|
|
||||||
|
Game moves flow through the existing board and bot endpoints — this module
|
||||||
|
handles pairings, standings, and lifecycle only.
|
||||||
|
|
||||||
|
## Streaming
|
||||||
|
Endpoints marked **NDJSON** return newline-delimited JSON objects
|
||||||
|
(`application/x-ndjson`). Each line is one complete JSON object. The
|
||||||
|
connection stays open until the tournament or round ends.
|
||||||
|
|
||||||
|
## Bot flow
|
||||||
|
```
|
||||||
|
POST /api/tournament # create
|
||||||
|
POST /api/tournament/{id}/join # each bot joins
|
||||||
|
POST /api/tournament/{id}/start # director starts
|
||||||
|
|
||||||
|
GET /api/tournament/{id}/stream (NDJSON) # open before start
|
||||||
|
|
||||||
|
-- per round --
|
||||||
|
receive gameStart { gameId, color }
|
||||||
|
GET /bot/stream/game/{gameId} (existing, NDJSON)
|
||||||
|
POST /bot/game/{gameId}/move/{uci} (existing)
|
||||||
|
-- repeat --
|
||||||
|
|
||||||
|
GET /api/tournament/{id}/results (NDJSON) # final standings
|
||||||
|
```
|
||||||
|
version: 1.0.0
|
||||||
|
|
||||||
|
servers:
|
||||||
|
- url: https://st.nowchess.janis-eccarius.de
|
||||||
|
description: Staging
|
||||||
|
- url: https://nowchess.janis-eccarius.de
|
||||||
|
description: Production
|
||||||
|
- url: http://localhost:8086
|
||||||
|
description: Local
|
||||||
|
|
||||||
|
security:
|
||||||
|
- bearerAuth: []
|
||||||
|
|
||||||
|
tags:
|
||||||
|
- name: Tournament
|
||||||
|
description: Tournament lifecycle
|
||||||
|
- name: Participation
|
||||||
|
description: Join and withdraw
|
||||||
|
- name: Results
|
||||||
|
description: Standings, pairings, and game export
|
||||||
|
- name: Stream
|
||||||
|
description: NDJSON event streams
|
||||||
|
|
||||||
|
paths:
|
||||||
|
|
||||||
|
/api/tournament:
|
||||||
|
get:
|
||||||
|
tags: [Tournament]
|
||||||
|
summary: Get current tournaments
|
||||||
|
description: Returns tournaments grouped by status. No auth required.
|
||||||
|
security: []
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Tournaments by status
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
created:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/TournamentInfo"
|
||||||
|
started:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/TournamentInfo"
|
||||||
|
finished:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/TournamentInfo"
|
||||||
|
|
||||||
|
post:
|
||||||
|
tags: [Tournament]
|
||||||
|
summary: Create a new tournament
|
||||||
|
description: The authenticated user becomes the tournament director.
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/x-www-form-urlencoded:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/CreateTournamentForm"
|
||||||
|
responses:
|
||||||
|
"201":
|
||||||
|
description: Tournament created
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Tournament"
|
||||||
|
"400":
|
||||||
|
$ref: "#/components/responses/BadRequest"
|
||||||
|
"401":
|
||||||
|
$ref: "#/components/responses/Unauthorized"
|
||||||
|
|
||||||
|
/api/tournament/{id}:
|
||||||
|
parameters:
|
||||||
|
- $ref: "#/components/parameters/id"
|
||||||
|
|
||||||
|
get:
|
||||||
|
tags: [Tournament]
|
||||||
|
summary: Get a tournament
|
||||||
|
description: Includes the first page of standings in the `standing` field.
|
||||||
|
security: []
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Tournament with embedded standings
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Tournament"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
|
||||||
|
delete:
|
||||||
|
tags: [Tournament]
|
||||||
|
summary: Terminate a tournament
|
||||||
|
description: Only the director may terminate. Only allowed while status is `created`.
|
||||||
|
responses:
|
||||||
|
"204":
|
||||||
|
description: Terminated
|
||||||
|
"401":
|
||||||
|
$ref: "#/components/responses/Unauthorized"
|
||||||
|
"403":
|
||||||
|
$ref: "#/components/responses/Forbidden"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
"409":
|
||||||
|
$ref: "#/components/responses/Conflict"
|
||||||
|
|
||||||
|
/api/tournament/{id}/start:
|
||||||
|
parameters:
|
||||||
|
- $ref: "#/components/parameters/id"
|
||||||
|
|
||||||
|
post:
|
||||||
|
tags: [Tournament]
|
||||||
|
summary: Start the tournament
|
||||||
|
description: |
|
||||||
|
Only the director may start. Requires at least 2 joined bots.
|
||||||
|
Computes round 1 pairings and creates games via `POST /api/board/game`.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Tournament started
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Tournament"
|
||||||
|
"401":
|
||||||
|
$ref: "#/components/responses/Unauthorized"
|
||||||
|
"403":
|
||||||
|
$ref: "#/components/responses/Forbidden"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
"409":
|
||||||
|
$ref: "#/components/responses/Conflict"
|
||||||
|
|
||||||
|
/api/tournament/{id}/join:
|
||||||
|
parameters:
|
||||||
|
- $ref: "#/components/parameters/id"
|
||||||
|
|
||||||
|
post:
|
||||||
|
tags: [Participation]
|
||||||
|
summary: Join a tournament
|
||||||
|
description: |
|
||||||
|
Register the authenticated bot for the tournament. Only allowed while
|
||||||
|
status is `created`. The token subject must be a bot account.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Ok
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Ok"
|
||||||
|
"401":
|
||||||
|
$ref: "#/components/responses/Unauthorized"
|
||||||
|
"403":
|
||||||
|
$ref: "#/components/responses/Forbidden"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
"409":
|
||||||
|
$ref: "#/components/responses/Conflict"
|
||||||
|
|
||||||
|
/api/tournament/{id}/withdraw:
|
||||||
|
parameters:
|
||||||
|
- $ref: "#/components/parameters/id"
|
||||||
|
|
||||||
|
post:
|
||||||
|
tags: [Participation]
|
||||||
|
summary: Withdraw from a tournament
|
||||||
|
description: Only allowed while status is `created`.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Ok
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Ok"
|
||||||
|
"401":
|
||||||
|
$ref: "#/components/responses/Unauthorized"
|
||||||
|
"403":
|
||||||
|
$ref: "#/components/responses/Forbidden"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
"409":
|
||||||
|
$ref: "#/components/responses/Conflict"
|
||||||
|
|
||||||
|
/api/tournament/{id}/results:
|
||||||
|
parameters:
|
||||||
|
- $ref: "#/components/parameters/id"
|
||||||
|
|
||||||
|
get:
|
||||||
|
tags: [Results]
|
||||||
|
summary: Get results as NDJSON stream
|
||||||
|
description: |
|
||||||
|
Streams one `Result` object per line, sorted by rank ascending.
|
||||||
|
Available at any point during or after the tournament.
|
||||||
|
security: []
|
||||||
|
parameters:
|
||||||
|
- name: nb
|
||||||
|
in: query
|
||||||
|
description: Max number of results to stream (default all)
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
minimum: 1
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: NDJSON stream of results
|
||||||
|
content:
|
||||||
|
application/x-ndjson:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Result"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
|
||||||
|
/api/tournament/{id}/round/{round}:
|
||||||
|
parameters:
|
||||||
|
- $ref: "#/components/parameters/id"
|
||||||
|
- name: round
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
minimum: 1
|
||||||
|
|
||||||
|
get:
|
||||||
|
tags: [Results]
|
||||||
|
summary: Get pairings for a round
|
||||||
|
security: []
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Pairings for the specified round
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
round:
|
||||||
|
type: integer
|
||||||
|
example: 2
|
||||||
|
pairings:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/Pairing"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
|
||||||
|
/api/tournament/{id}/export/games:
|
||||||
|
parameters:
|
||||||
|
- $ref: "#/components/parameters/id"
|
||||||
|
|
||||||
|
get:
|
||||||
|
tags: [Results]
|
||||||
|
summary: Export all games
|
||||||
|
description: |
|
||||||
|
Returns all games of the tournament. Accepts both PGN and NDJSON via
|
||||||
|
the `Accept` header.
|
||||||
|
security: []
|
||||||
|
parameters:
|
||||||
|
- name: Accept
|
||||||
|
in: header
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- application/x-chess-pgn
|
||||||
|
- application/x-ndjson
|
||||||
|
default: application/x-chess-pgn
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Games in the requested format
|
||||||
|
content:
|
||||||
|
application/x-chess-pgn:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
description: Standard PGN, one game per block
|
||||||
|
application/x-ndjson:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/GameExport"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
|
||||||
|
/api/tournament/{id}/stream:
|
||||||
|
parameters:
|
||||||
|
- $ref: "#/components/parameters/id"
|
||||||
|
|
||||||
|
get:
|
||||||
|
tags: [Stream]
|
||||||
|
summary: Stream tournament events
|
||||||
|
description: |
|
||||||
|
NDJSON stream scoped to one tournament. Keep this connection open for
|
||||||
|
the full tournament lifetime.
|
||||||
|
|
||||||
|
On `gameStart` the bot connects to the existing bot endpoints:
|
||||||
|
- `GET /bot/stream/game/{gameId}` — stream game state (existing)
|
||||||
|
- `POST /bot/game/{gameId}/move/{uci}` — submit moves (existing)
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: NDJSON event stream
|
||||||
|
content:
|
||||||
|
application/x-ndjson:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/TournamentEvent"
|
||||||
|
"401":
|
||||||
|
$ref: "#/components/responses/Unauthorized"
|
||||||
|
"404":
|
||||||
|
$ref: "#/components/responses/NotFound"
|
||||||
|
|
||||||
|
components:
|
||||||
|
|
||||||
|
securitySchemes:
|
||||||
|
bearerAuth:
|
||||||
|
type: http
|
||||||
|
scheme: bearer
|
||||||
|
bearerFormat: JWT
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
id:
|
||||||
|
name: id
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
example: t7kXq2
|
||||||
|
|
||||||
|
schemas:
|
||||||
|
|
||||||
|
Clock:
|
||||||
|
type: object
|
||||||
|
required: [limit, increment]
|
||||||
|
properties:
|
||||||
|
limit:
|
||||||
|
type: integer
|
||||||
|
description: Base time in seconds
|
||||||
|
example: 300
|
||||||
|
increment:
|
||||||
|
type: integer
|
||||||
|
description: Increment per move in seconds
|
||||||
|
example: 3
|
||||||
|
|
||||||
|
Variant:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
key:
|
||||||
|
type: string
|
||||||
|
example: standard
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
example: Standard
|
||||||
|
|
||||||
|
BotRef:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: string
|
||||||
|
example: bot_abc
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
example: StockfishClone
|
||||||
|
|
||||||
|
Standing:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
page:
|
||||||
|
type: integer
|
||||||
|
example: 1
|
||||||
|
players:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/Result"
|
||||||
|
|
||||||
|
TournamentInfo:
|
||||||
|
description: Lightweight tournament summary used in list responses.
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: string
|
||||||
|
example: t7kXq2
|
||||||
|
fullName:
|
||||||
|
type: string
|
||||||
|
example: Friday Night Bots Swiss
|
||||||
|
clock:
|
||||||
|
$ref: "#/components/schemas/Clock"
|
||||||
|
variant:
|
||||||
|
$ref: "#/components/schemas/Variant"
|
||||||
|
rated:
|
||||||
|
type: boolean
|
||||||
|
example: true
|
||||||
|
nbPlayers:
|
||||||
|
type: integer
|
||||||
|
example: 8
|
||||||
|
nbRounds:
|
||||||
|
type: integer
|
||||||
|
example: 5
|
||||||
|
createdBy:
|
||||||
|
type: string
|
||||||
|
example: userId
|
||||||
|
startsAt:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
|
||||||
|
Tournament:
|
||||||
|
allOf:
|
||||||
|
- $ref: "#/components/schemas/TournamentInfo"
|
||||||
|
- type: object
|
||||||
|
properties:
|
||||||
|
status:
|
||||||
|
type: string
|
||||||
|
enum: [created, started, finished]
|
||||||
|
example: started
|
||||||
|
round:
|
||||||
|
type: integer
|
||||||
|
description: Current round number
|
||||||
|
example: 2
|
||||||
|
standing:
|
||||||
|
$ref: "#/components/schemas/Standing"
|
||||||
|
winner:
|
||||||
|
description: Present only when status is `finished`
|
||||||
|
allOf:
|
||||||
|
- $ref: "#/components/schemas/BotRef"
|
||||||
|
nullable: true
|
||||||
|
|
||||||
|
CreateTournamentForm:
|
||||||
|
type: object
|
||||||
|
required: [name, nbRounds, clockLimit, clockIncrement]
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
example: Friday Night Bots
|
||||||
|
nbRounds:
|
||||||
|
type: integer
|
||||||
|
minimum: 1
|
||||||
|
example: 5
|
||||||
|
clockLimit:
|
||||||
|
type: integer
|
||||||
|
description: Base time in seconds
|
||||||
|
example: 300
|
||||||
|
clockIncrement:
|
||||||
|
type: integer
|
||||||
|
description: Increment per move in seconds
|
||||||
|
example: 3
|
||||||
|
rated:
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
|
||||||
|
Result:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
rank:
|
||||||
|
type: integer
|
||||||
|
example: 1
|
||||||
|
points:
|
||||||
|
type: number
|
||||||
|
format: double
|
||||||
|
example: 3.5
|
||||||
|
tieBreak:
|
||||||
|
type: number
|
||||||
|
format: double
|
||||||
|
description: Buchholz score (sum of opponents' points)
|
||||||
|
example: 9.0
|
||||||
|
bot:
|
||||||
|
$ref: "#/components/schemas/BotRef"
|
||||||
|
nbGames:
|
||||||
|
type: integer
|
||||||
|
example: 4
|
||||||
|
wins:
|
||||||
|
type: integer
|
||||||
|
example: 3
|
||||||
|
draws:
|
||||||
|
type: integer
|
||||||
|
example: 1
|
||||||
|
losses:
|
||||||
|
type: integer
|
||||||
|
example: 0
|
||||||
|
|
||||||
|
Pairing:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
round:
|
||||||
|
type: integer
|
||||||
|
example: 2
|
||||||
|
white:
|
||||||
|
$ref: "#/components/schemas/BotRef"
|
||||||
|
black:
|
||||||
|
$ref: "#/components/schemas/BotRef"
|
||||||
|
gameId:
|
||||||
|
type: string
|
||||||
|
example: j0nPtcjl
|
||||||
|
winner:
|
||||||
|
type: string
|
||||||
|
enum: [white, black, draw]
|
||||||
|
nullable: true
|
||||||
|
description: Null while the game is ongoing
|
||||||
|
|
||||||
|
GameExport:
|
||||||
|
description: One game object per NDJSON line.
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: string
|
||||||
|
example: j0nPtcjl
|
||||||
|
round:
|
||||||
|
type: integer
|
||||||
|
example: 2
|
||||||
|
white:
|
||||||
|
$ref: "#/components/schemas/BotRef"
|
||||||
|
black:
|
||||||
|
$ref: "#/components/schemas/BotRef"
|
||||||
|
winner:
|
||||||
|
type: string
|
||||||
|
enum: [white, black, draw]
|
||||||
|
nullable: true
|
||||||
|
moves:
|
||||||
|
type: string
|
||||||
|
description: Space-separated UCI moves
|
||||||
|
example: e2e4 e7e5 g1f3
|
||||||
|
|
||||||
|
TournamentEvent:
|
||||||
|
description: |
|
||||||
|
One JSON object per NDJSON line. Discriminate on `type`.
|
||||||
|
|
||||||
|
| type | extra fields |
|
||||||
|
|------|-------------|
|
||||||
|
| `tournamentStarted` | — |
|
||||||
|
| `roundStarted` | `round` |
|
||||||
|
| `gameStart` | `round`, `gameId`, `color` |
|
||||||
|
| `roundFinished` | `round` |
|
||||||
|
| `tournamentFinished` | `winner` |
|
||||||
|
type: object
|
||||||
|
required: [type]
|
||||||
|
properties:
|
||||||
|
type:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- tournamentStarted
|
||||||
|
- roundStarted
|
||||||
|
- gameStart
|
||||||
|
- roundFinished
|
||||||
|
- tournamentFinished
|
||||||
|
round:
|
||||||
|
type: integer
|
||||||
|
example: 2
|
||||||
|
gameId:
|
||||||
|
type: string
|
||||||
|
example: j0nPtcjl
|
||||||
|
color:
|
||||||
|
type: string
|
||||||
|
enum: [white, black]
|
||||||
|
winner:
|
||||||
|
$ref: "#/components/schemas/BotRef"
|
||||||
|
|
||||||
|
Ok:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
ok:
|
||||||
|
type: boolean
|
||||||
|
example: true
|
||||||
|
|
||||||
|
Error:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
error:
|
||||||
|
type: string
|
||||||
|
example: tournament already started
|
||||||
|
|
||||||
|
responses:
|
||||||
|
BadRequest:
|
||||||
|
description: Invalid request body or parameters
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Error"
|
||||||
|
Unauthorized:
|
||||||
|
description: Missing or invalid JWT
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Error"
|
||||||
|
Forbidden:
|
||||||
|
description: Action not permitted for this user or bot
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Error"
|
||||||
|
NotFound:
|
||||||
|
description: Tournament not found
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Error"
|
||||||
|
Conflict:
|
||||||
|
description: Conflicting state (e.g. already started, bot already joined)
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "#/components/schemas/Error"
|
||||||
@@ -29,3 +29,464 @@
|
|||||||
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
## (2026-04-30)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
## (2026-05-01)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
## (2026-05-02)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
## (2026-05-06)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
## (2026-05-09)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
## (2026-05-10)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
## (2026-05-10)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
## (2026-05-11)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
## (2026-05-12)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
## (2026-05-12)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
## (2026-05-12)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
## (2026-05-13)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
* remove unused HTTP root-path configurations from application.yml ([3ed3e59](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3ed3e59ee456d54cd3d65ece4f36623e256b9736))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
## (2026-05-16)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
* NCS-84 More Verbose Logging ([#51](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/51)) ([4ad92ab](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/4ad92ab23698267f8faa59c4e18388d4a0042cca))
|
||||||
|
* remove unused HTTP root-path configurations from application.yml ([3ed3e59](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3ed3e59ee456d54cd3d65ece4f36623e256b9736))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
## (2026-05-19)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **account:** implement token pair handling for login and refresh endpoints ([9296db8](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/9296db88b7131bbda9b9b0da65c327ef9063ee31))
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
* NCS-84 More Verbose Logging ([#51](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/51)) ([4ad92ab](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/4ad92ab23698267f8faa59c4e18388d4a0042cca))
|
||||||
|
* remove unused HTTP root-path configurations from application.yml ([3ed3e59](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3ed3e59ee456d54cd3d65ece4f36623e256b9736))
|
||||||
|
* **tests:** update token path to accessToken in ChallengeResourceTest ([354db11](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/354db11972342c47a1034303c11bccfb92e60109))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
## (2026-05-21)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **account:** implement token pair handling for login and refresh endpoints ([9296db8](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/9296db88b7131bbda9b9b0da65c327ef9063ee31))
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **account:** configure JDBC connection pool size to prevent exhaustion under load ([29072ef](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/29072efbfb1cfa1c3b1a85b4c1a587c971d245f9))
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
* NCS-84 More Verbose Logging ([#51](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/51)) ([4ad92ab](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/4ad92ab23698267f8faa59c4e18388d4a0042cca))
|
||||||
|
* remove unused HTTP root-path configurations from application.yml ([3ed3e59](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3ed3e59ee456d54cd3d65ece4f36623e256b9736))
|
||||||
|
* **tests:** update token path to accessToken in ChallengeResourceTest ([354db11](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/354db11972342c47a1034303c11bccfb92e60109))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
## (2026-06-03)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **account:** implement token pair handling for login and refresh endpoints ([9296db8](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/9296db88b7131bbda9b9b0da65c327ef9063ee31))
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **account:** configure JDBC connection pool size to prevent exhaustion under load ([29072ef](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/29072efbfb1cfa1c3b1a85b4c1a587c971d245f9))
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
* NCS-84 More Verbose Logging ([#51](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/51)) ([4ad92ab](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/4ad92ab23698267f8faa59c4e18388d4a0042cca))
|
||||||
|
* **official-bots:** NCS-70-auto-register official bots with account service ([#59](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/59)) ([7117a93](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/7117a93376272094d0b1a6abf2121254ce396684))
|
||||||
|
* remove unused HTTP root-path configurations from application.yml ([3ed3e59](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3ed3e59ee456d54cd3d65ece4f36623e256b9736))
|
||||||
|
* **tests:** update token path to accessToken in ChallengeResourceTest ([354db11](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/354db11972342c47a1034303c11bccfb92e60109))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
## (2026-06-05)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **account:** implement token pair handling for login and refresh endpoints ([9296db8](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/9296db88b7131bbda9b9b0da65c327ef9063ee31))
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **api:** define shared EventEnvelope and EventType for Redis EventBus ([#61](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/61)) ([595c172](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/595c172900da99de367c274488c3ccbeaef55882))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **account:** configure JDBC connection pool size to prevent exhaustion under load ([29072ef](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/29072efbfb1cfa1c3b1a85b4c1a587c971d245f9))
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
* NCS-84 More Verbose Logging ([#51](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/51)) ([4ad92ab](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/4ad92ab23698267f8faa59c4e18388d4a0042cca))
|
||||||
|
* **official-bots:** NCS-70-auto-register official bots with account service ([#59](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/59)) ([7117a93](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/7117a93376272094d0b1a6abf2121254ce396684))
|
||||||
|
* remove unused HTTP root-path configurations from application.yml ([3ed3e59](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3ed3e59ee456d54cd3d65ece4f36623e256b9736))
|
||||||
|
* **tests:** update token path to accessToken in ChallengeResourceTest ([354db11](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/354db11972342c47a1034303c11bccfb92e60109))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
## (2026-06-09)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **account:** implement token pair handling for login and refresh endpoints ([9296db8](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/9296db88b7131bbda9b9b0da65c327ef9063ee31))
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **api:** define shared EventEnvelope and EventType for Redis EventBus ([#61](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/61)) ([595c172](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/595c172900da99de367c274488c3ccbeaef55882))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **events:** migrate game-creation and bot flows to Redis Streams NCS-89 ([#62](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/62)) ([a24924c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a24924c23057db3d700a75dbc4333557789cd991))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **account:** configure JDBC connection pool size to prevent exhaustion under load ([29072ef](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/29072efbfb1cfa1c3b1a85b4c1a587c971d245f9))
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
* NCS-84 More Verbose Logging ([#51](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/51)) ([4ad92ab](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/4ad92ab23698267f8faa59c4e18388d4a0042cca))
|
||||||
|
* **official-bots:** NCS-70-auto-register official bots with account service ([#59](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/59)) ([7117a93](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/7117a93376272094d0b1a6abf2121254ce396684))
|
||||||
|
* remove unused HTTP root-path configurations from application.yml ([3ed3e59](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3ed3e59ee456d54cd3d65ece4f36623e256b9736))
|
||||||
|
* **tests:** update token path to accessToken in ChallengeResourceTest ([354db11](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/354db11972342c47a1034303c11bccfb92e60109))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
## (2026-06-09)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **account:** implement token pair handling for login and refresh endpoints ([9296db8](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/9296db88b7131bbda9b9b0da65c327ef9063ee31))
|
||||||
|
* add authentication permissions for metrics endpoints in application.yml ([04edd4d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/04edd4d6fd8a63196c36f6d67992832febc9bebb))
|
||||||
|
* add initialization metrics for various services ([d438e97](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d438e97f32bdde0bfc63c1b4a8cc810cdd093166))
|
||||||
|
* add OpenTelemetry trace configuration with parentbased sampler ([3904d5a](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3904d5ad8ad4930ddee65287a7bfab785a6148f5))
|
||||||
|
* **api:** define shared EventEnvelope and EventType for Redis EventBus ([#61](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/61)) ([595c172](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/595c172900da99de367c274488c3ccbeaef55882))
|
||||||
|
* **config:** add H2 database configuration for testing environment ([39c9e49](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/39c9e492cef2515368c074da9406f95e9c0c9e64))
|
||||||
|
* **config:** update application.yml for PostgreSQL and remove staging/production configurations ([2404e61](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/2404e6164c3b50ffccbea5238d636060d6abe4d6))
|
||||||
|
* **config:** update application.yml for staging and production environments ([6113432](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/6113432a14c476a3a0dfc0d449e17d023697f2ba))
|
||||||
|
* configure logging and add OpenTelemetry support ([#49](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/49)) ([d57c488](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/d57c4886612d1d92da0e1b79209fc83e6ef537a1))
|
||||||
|
* **docker:** add .dockerignore and .gitignore files for build exclusions ([c987d8e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c987d8e258c0e6c4cfbdaa8381c64c410d7a2b83))
|
||||||
|
* **docker:** add Dockerfiles for building Quarkus application in native and JVM modes ([3f2d2bb](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3f2d2bb4c97fa8cddba66e1da4427c54236dfeed))
|
||||||
|
* **docker:** add Dockerfiles for Quarkus application in JVM and native modes ([34b9933](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/34b993304670cf2aa62cd2f6460cee7b9864b08e))
|
||||||
|
* **events:** migrate game-creation and bot flows to Redis Streams NCS-89 ([#62](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/62)) ([a24924c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a24924c23057db3d700a75dbc4333557789cd991))
|
||||||
|
* **logging:** add DEBUG/INFO/WARN logging across services (NCS-72) ([#41](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/41)) ([804a4bf](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/804a4bf179e3dfb19e2be4390e7e543caf5237c6))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#46](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/46)) ([649566e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/649566eb3fcf38f91c8896a739f74ea318af312d))
|
||||||
|
* NCS-78 Add Traceability to the Applications ([#47](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/47)) ([87dfc6c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/87dfc6c2bcce7f7d58fc641bd8d468a2e584c108))
|
||||||
|
* NCS-82 add Swiss-system tournament module ([#55](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/55)) ([c5661de](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/c5661de4a0ebf4b33211f5a391840dcf744656b7))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
* update application.yml with new API root paths and add Micrometer and OpenTelemetry dependencies ([72ce262](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/72ce262bc491f94297700e6002fb5d0812e2cc2a))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **account:** configure JDBC connection pool size to prevent exhaustion under load ([29072ef](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/29072efbfb1cfa1c3b1a85b4c1a587c971d245f9))
|
||||||
|
* **auth:** add InternalClientHeadersFactory for custom client headers management ([e279c39](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/e279c39246470156bf11e745ee72204018d4229d))
|
||||||
|
* NCS-84 More Verbose Logging ([#51](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/51)) ([4ad92ab](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/4ad92ab23698267f8faa59c4e18388d4a0042cca))
|
||||||
|
* **official-bots:** NCS-70-auto-register official bots with account service ([#59](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/59)) ([7117a93](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/7117a93376272094d0b1a6abf2121254ce396684))
|
||||||
|
* remove unused HTTP root-path configurations from application.yml ([3ed3e59](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/3ed3e59ee456d54cd3d65ece4f36623e256b9736))
|
||||||
|
* **tests:** update token path to accessToken in ChallengeResourceTest ([354db11](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/354db11972342c47a1034303c11bccfb92e60109))
|
||||||
|
|
||||||
|
### Reverts
|
||||||
|
|
||||||
|
* Revert "feat: add authentication permissions for metrics endpoints in application.yml" ([a298417](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a298417b9e4d68dc73bbf40be63d9484536e9f83))
|
||||||
|
* Revert "refactor: update metrics paths formatting in application.yml for clarity" ([3870566](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/38705663498d5f47c40dafe2f26198589ede8656))
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ dependencies {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
implementation(project(":modules:api"))
|
||||||
implementation(project(":modules:security"))
|
implementation(project(":modules:security"))
|
||||||
|
|
||||||
implementation(platform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
|
implementation(platform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
|
||||||
@@ -59,7 +60,10 @@ dependencies {
|
|||||||
implementation("io.quarkus:quarkus-smallrye-jwt-build")
|
implementation("io.quarkus:quarkus-smallrye-jwt-build")
|
||||||
implementation("io.quarkus:quarkus-elytron-security-common")
|
implementation("io.quarkus:quarkus-elytron-security-common")
|
||||||
implementation("io.quarkus:quarkus-smallrye-health")
|
implementation("io.quarkus:quarkus-smallrye-health")
|
||||||
|
implementation("io.quarkus:quarkus-logging-json")
|
||||||
implementation("io.quarkus:quarkus-micrometer")
|
implementation("io.quarkus:quarkus-micrometer")
|
||||||
|
implementation("io.quarkus:quarkus-micrometer-registry-prometheus")
|
||||||
|
implementation("io.quarkus:quarkus-opentelemetry")
|
||||||
implementation("io.quarkus:quarkus-smallrye-openapi")
|
implementation("io.quarkus:quarkus-smallrye-openapi")
|
||||||
implementation("com.fasterxml.jackson.module:jackson-module-scala_3:${versions["JACKSON_SCALA"]!!}")
|
implementation("com.fasterxml.jackson.module:jackson-module-scala_3:${versions["JACKSON_SCALA"]!!}")
|
||||||
implementation("io.quarkus:quarkus-redis-client")
|
implementation("io.quarkus:quarkus-redis-client")
|
||||||
|
|||||||
@@ -57,6 +57,16 @@ nowchess:
|
|||||||
|
|
||||||
"%deployed":
|
"%deployed":
|
||||||
quarkus:
|
quarkus:
|
||||||
|
log:
|
||||||
|
console:
|
||||||
|
json: true
|
||||||
|
otel:
|
||||||
|
traces:
|
||||||
|
sampler: parentbased_traceidratio
|
||||||
|
sampler-arg: 0.1
|
||||||
|
exporter:
|
||||||
|
otlp:
|
||||||
|
endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT:http://localhost:4317}
|
||||||
rest-client:
|
rest-client:
|
||||||
core-service:
|
core-service:
|
||||||
url: ${CORE_SERVICE_URL}
|
url: ${CORE_SERVICE_URL}
|
||||||
@@ -66,6 +76,9 @@ nowchess:
|
|||||||
password: ${DB_PASSWORD}
|
password: ${DB_PASSWORD}
|
||||||
jdbc:
|
jdbc:
|
||||||
url: ${DB_URL}
|
url: ${DB_URL}
|
||||||
|
min-size: 10
|
||||||
|
max-size: 50
|
||||||
|
acquisition-timeout: 30
|
||||||
hibernate-orm:
|
hibernate-orm:
|
||||||
schema-management:
|
schema-management:
|
||||||
strategy: update
|
strategy: update
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package de.nowchess.account.client
|
||||||
|
|
||||||
|
case class CorePlayerInfo(id: String, displayName: String)
|
||||||
|
case class CoreTimeControl(limitSeconds: Option[Int], incrementSeconds: Option[Int], daysPerMove: Option[Int])
|
||||||
|
case class CoreCreateGameRequest(
|
||||||
|
white: Option[CorePlayerInfo],
|
||||||
|
black: Option[CorePlayerInfo],
|
||||||
|
timeControl: Option[CoreTimeControl],
|
||||||
|
mode: Option[String],
|
||||||
|
)
|
||||||
+133
@@ -0,0 +1,133 @@
|
|||||||
|
package de.nowchess.account.client
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
|
import de.nowchess.account.config.RedisConfig
|
||||||
|
import de.nowchess.api.dto.{GameCreationRequestDto, GameCreationResponseDto, PlayerInfoDto, TimeControlDto}
|
||||||
|
import de.nowchess.api.game.GameMode
|
||||||
|
import de.nowchess.api.player.PlayerType
|
||||||
|
import de.nowchess.api.event.{EventEnvelope, EventType}
|
||||||
|
import io.quarkus.redis.datasource.RedisDataSource
|
||||||
|
import io.quarkus.redis.datasource.stream.{StreamMessage, XAddArgs, XGroupCreateArgs, XReadGroupArgs}
|
||||||
|
import io.quarkus.runtime.StartupEvent
|
||||||
|
import jakarta.enterprise.context.ApplicationScoped
|
||||||
|
import jakarta.enterprise.event.Observes
|
||||||
|
import jakarta.inject.Inject
|
||||||
|
import org.eclipse.microprofile.config.inject.ConfigProperty
|
||||||
|
import org.eclipse.microprofile.context.ManagedExecutor
|
||||||
|
import org.jboss.logging.Logger
|
||||||
|
import scala.compiletime.uninitialized
|
||||||
|
import scala.jdk.CollectionConverters.*
|
||||||
|
import scala.util.{Failure, Success, Try}
|
||||||
|
import java.time.Duration
|
||||||
|
import java.util.UUID
|
||||||
|
import java.util.concurrent.{CompletableFuture, ConcurrentHashMap, TimeUnit}
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
class GameCreationStreamClient:
|
||||||
|
|
||||||
|
// scalafix:off DisableSyntax.var
|
||||||
|
@Inject var redis: RedisDataSource = uninitialized
|
||||||
|
@Inject var redisConfig: RedisConfig = uninitialized
|
||||||
|
@Inject var objectMapper: ObjectMapper = uninitialized
|
||||||
|
@Inject var executor: ManagedExecutor = uninitialized
|
||||||
|
@ConfigProperty(name = "nowchess.game-creation-stream.enabled", defaultValue = "true")
|
||||||
|
private var streamEnabled: Boolean = true
|
||||||
|
// scalafix:on DisableSyntax.var
|
||||||
|
|
||||||
|
private val log = Logger.getLogger(classOf[GameCreationStreamClient])
|
||||||
|
private val instanceId = UUID.randomUUID().toString
|
||||||
|
private val groupName = s"account-game-creation-$instanceId"
|
||||||
|
private val consumerId = instanceId
|
||||||
|
private val maxStreamLen = 1000L
|
||||||
|
private val timeout = Duration.ofSeconds(10)
|
||||||
|
|
||||||
|
private val pending = new ConcurrentHashMap[String, CompletableFuture[GameCreationResponseDto]]()
|
||||||
|
|
||||||
|
private def requestStream: String = s"${redisConfig.prefix}:game-creation"
|
||||||
|
private def responseStream: String = s"${redisConfig.prefix}:game-creation-response"
|
||||||
|
|
||||||
|
def start(@Observes _ev: StartupEvent): Unit =
|
||||||
|
if streamEnabled then
|
||||||
|
createGroupIfAbsent()
|
||||||
|
executor.submit(
|
||||||
|
new Runnable:
|
||||||
|
def run(): Unit = pollLoop(),
|
||||||
|
)
|
||||||
|
log.infof("Game-creation response listener started (consumer=%s)", consumerId)
|
||||||
|
|
||||||
|
def createGame(req: CoreCreateGameRequest): GameCreationResponseDto =
|
||||||
|
val correlationId = UUID.randomUUID().toString
|
||||||
|
val future = new CompletableFuture[GameCreationResponseDto]()
|
||||||
|
pending.put(correlationId, future)
|
||||||
|
Try {
|
||||||
|
val payload = objectMapper.valueToTree[com.fasterxml.jackson.databind.JsonNode](toDto(req))
|
||||||
|
val envelope = EventEnvelope.of(EventType.GameCreationRequest, payload, Some(correlationId))
|
||||||
|
publish(requestStream, envelope)
|
||||||
|
future.get(timeout.toMillis, TimeUnit.MILLISECONDS)
|
||||||
|
} match
|
||||||
|
case Success(resp) =>
|
||||||
|
pending.remove(correlationId)
|
||||||
|
resp
|
||||||
|
case Failure(ex) =>
|
||||||
|
pending.remove(correlationId)
|
||||||
|
log.errorf(ex, "Game creation request %s failed", correlationId)
|
||||||
|
GameCreationResponseDto(None, Some("Game creation request timed out or failed"))
|
||||||
|
|
||||||
|
private def toDto(req: CoreCreateGameRequest): GameCreationRequestDto =
|
||||||
|
GameCreationRequestDto(
|
||||||
|
white = req.white.map(p => PlayerInfoDto(p.id, p.displayName, PlayerType.Human)),
|
||||||
|
black = req.black.map(p => PlayerInfoDto(p.id, p.displayName, PlayerType.Human)),
|
||||||
|
timeControl = req.timeControl.map(t => TimeControlDto(t.limitSeconds, t.incrementSeconds, t.daysPerMove)),
|
||||||
|
mode = req.mode.map(_ => GameMode.Authenticated),
|
||||||
|
)
|
||||||
|
|
||||||
|
private def createGroupIfAbsent(): Unit =
|
||||||
|
Try(
|
||||||
|
redis
|
||||||
|
.stream(classOf[String])
|
||||||
|
.xgroupCreate(responseStream, groupName, "0", new XGroupCreateArgs().mkstream()),
|
||||||
|
) match
|
||||||
|
case Failure(ex) if Option(ex.getMessage).exists(_.contains("BUSYGROUP")) => ()
|
||||||
|
case Failure(ex) => log.warnf(ex, "Failed to create response consumer group")
|
||||||
|
case Success(_) => ()
|
||||||
|
|
||||||
|
private def pollLoop(): Unit =
|
||||||
|
while true do
|
||||||
|
Try {
|
||||||
|
val messages = redis
|
||||||
|
.stream(classOf[String])
|
||||||
|
.xreadgroup(
|
||||||
|
groupName,
|
||||||
|
consumerId,
|
||||||
|
responseStream,
|
||||||
|
">",
|
||||||
|
new XReadGroupArgs().count(10).block(Duration.ofSeconds(2)),
|
||||||
|
)
|
||||||
|
Option(messages).foreach(_.forEach(handleResponse))
|
||||||
|
} match
|
||||||
|
case Failure(ex) => log.warnf(ex, "Error in game-creation response poll loop")
|
||||||
|
case Success(_) => ()
|
||||||
|
|
||||||
|
private def handleResponse(msg: StreamMessage[String, String, String]): Unit =
|
||||||
|
val json = msg.payload().get("data")
|
||||||
|
Try(objectMapper.readValue(json, classOf[EventEnvelope])) match
|
||||||
|
case Success(envelope) =>
|
||||||
|
envelope.correlationId.flatMap(id => Option(pending.remove(id))).foreach { future =>
|
||||||
|
Try(objectMapper.treeToValue(envelope.payload, classOf[GameCreationResponseDto])) match
|
||||||
|
case Success(resp) => future.complete(resp)
|
||||||
|
case Failure(ex) => future.completeExceptionally(ex)
|
||||||
|
}
|
||||||
|
case Failure(ex) => log.warnf(ex, "Unparseable game-creation response: %s", json)
|
||||||
|
ack(msg.id())
|
||||||
|
|
||||||
|
private def ack(id: String): Unit =
|
||||||
|
Try(redis.stream(classOf[String]).xack(responseStream, groupName, id)) match
|
||||||
|
case Failure(ex) => log.warnf(ex, "Failed to ack response %s", id)
|
||||||
|
case Success(_) => ()
|
||||||
|
|
||||||
|
private def publish(key: String, envelope: EventEnvelope): Unit =
|
||||||
|
val json = objectMapper.writeValueAsString(envelope)
|
||||||
|
redis
|
||||||
|
.stream(classOf[String])
|
||||||
|
.xadd(key, new XAddArgs().maxlen(maxStreamLen).nearlyExactTrimming(), Map("data" -> json).asJava)
|
||||||
|
()
|
||||||
+16
-3
@@ -1,6 +1,6 @@
|
|||||||
package de.nowchess.account.config
|
package de.nowchess.account.config
|
||||||
|
|
||||||
import de.nowchess.account.client.{CoreCreateGameRequest, CoreGameResponse, CorePlayerInfo, CoreTimeControl}
|
import de.nowchess.account.client.{CoreCreateGameRequest, CorePlayerInfo, CoreTimeControl}
|
||||||
import de.nowchess.account.domain.{
|
import de.nowchess.account.domain.{
|
||||||
BotAccount,
|
BotAccount,
|
||||||
Challenge,
|
Challenge,
|
||||||
@@ -12,10 +12,19 @@ import de.nowchess.account.domain.{
|
|||||||
UserAccount,
|
UserAccount,
|
||||||
}
|
}
|
||||||
import de.nowchess.account.dto.*
|
import de.nowchess.account.dto.*
|
||||||
|
import de.nowchess.api.dto.{
|
||||||
|
GameCreationRequestDto,
|
||||||
|
GameCreationResponseDto,
|
||||||
|
PlayerInfoDto as ApiPlayerInfoDto,
|
||||||
|
TimeControlDto as ApiTimeControlDto,
|
||||||
|
}
|
||||||
|
import de.nowchess.api.event.{EventEnvelope, EventType}
|
||||||
import io.quarkus.runtime.annotations.RegisterForReflection
|
import io.quarkus.runtime.annotations.RegisterForReflection
|
||||||
|
|
||||||
@RegisterForReflection(
|
@RegisterForReflection(
|
||||||
targets = Array(
|
targets = Array(
|
||||||
|
classOf[EventEnvelope],
|
||||||
|
classOf[EventType],
|
||||||
classOf[UserAccount],
|
classOf[UserAccount],
|
||||||
classOf[BotAccount],
|
classOf[BotAccount],
|
||||||
classOf[OfficialBotAccount],
|
classOf[OfficialBotAccount],
|
||||||
@@ -25,7 +34,8 @@ import io.quarkus.runtime.annotations.RegisterForReflection
|
|||||||
classOf[DeclineReason],
|
classOf[DeclineReason],
|
||||||
classOf[TimeControl],
|
classOf[TimeControl],
|
||||||
classOf[LoginRequest],
|
classOf[LoginRequest],
|
||||||
classOf[TokenResponse],
|
classOf[RefreshRequest],
|
||||||
|
classOf[TokenPairResponse],
|
||||||
classOf[PlayerInfo],
|
classOf[PlayerInfo],
|
||||||
classOf[PublicAccountDto],
|
classOf[PublicAccountDto],
|
||||||
classOf[BotAccountDto],
|
classOf[BotAccountDto],
|
||||||
@@ -43,8 +53,11 @@ import io.quarkus.runtime.annotations.RegisterForReflection
|
|||||||
classOf[CorePlayerInfo],
|
classOf[CorePlayerInfo],
|
||||||
classOf[CoreTimeControl],
|
classOf[CoreTimeControl],
|
||||||
classOf[CoreCreateGameRequest],
|
classOf[CoreCreateGameRequest],
|
||||||
classOf[CoreGameResponse],
|
|
||||||
classOf[OfficialChallengeResponse],
|
classOf[OfficialChallengeResponse],
|
||||||
|
classOf[GameCreationRequestDto],
|
||||||
|
classOf[GameCreationResponseDto],
|
||||||
|
classOf[ApiPlayerInfoDto],
|
||||||
|
classOf[ApiTimeControlDto],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
class NativeReflectionConfig
|
class NativeReflectionConfig
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import scala.compiletime.uninitialized
|
|||||||
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import scala.Conversion
|
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "challenges")
|
@Table(name = "challenges")
|
||||||
@@ -34,13 +33,14 @@ class Challenge extends PanacheEntityBase:
|
|||||||
@Column(nullable = true, columnDefinition = "varchar(255)")
|
@Column(nullable = true, columnDefinition = "varchar(255)")
|
||||||
var declineReason: DeclineReason = uninitialized
|
var declineReason: DeclineReason = uninitialized
|
||||||
|
|
||||||
var timeControlType: String = uninitialized
|
@Column(nullable = true)
|
||||||
|
var limitSeconds: java.lang.Integer = uninitialized
|
||||||
|
|
||||||
@Column(nullable = true)
|
@Column(nullable = true)
|
||||||
var timeControlLimit: java.lang.Integer = uninitialized
|
var incrementSeconds: java.lang.Integer = uninitialized
|
||||||
|
|
||||||
@Column(nullable = true)
|
@Column(nullable = true)
|
||||||
var timeControlIncrement: java.lang.Integer = uninitialized
|
var daysPerMove: java.lang.Integer = uninitialized
|
||||||
|
|
||||||
var createdAt: Instant = uninitialized
|
var createdAt: Instant = uninitialized
|
||||||
|
|
||||||
@@ -52,5 +52,6 @@ class Challenge extends PanacheEntityBase:
|
|||||||
|
|
||||||
def gameIdOpt: Option[String] = Option(gameId)
|
def gameIdOpt: Option[String] = Option(gameId)
|
||||||
def declineReasonOpt: Option[DeclineReason] = Option(declineReason)
|
def declineReasonOpt: Option[DeclineReason] = Option(declineReason)
|
||||||
def timeControlLimitOpt: Option[Int] = Option(timeControlLimit).map(_.intValue())
|
def limitSecondsOpt: Option[Int] = Option(limitSeconds).map(_.intValue())
|
||||||
def timeControlIncrementOpt: Option[Int] = Option(timeControlIncrement).map(_.intValue())
|
def incrementSecondsOpt: Option[Int] = Option(incrementSeconds).map(_.intValue())
|
||||||
|
def daysPerMoveOpt: Option[Int] = Option(daysPerMove).map(_.intValue())
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class BotAccount extends PanacheEntityBase:
|
|||||||
@JoinColumn(name = "owner_id", nullable = false)
|
@JoinColumn(name = "owner_id", nullable = false)
|
||||||
var owner: UserAccount = uninitialized
|
var owner: UserAccount = uninitialized
|
||||||
|
|
||||||
@Column(unique = true, nullable = false, length = 256)
|
@Column(unique = true, nullable = false, length = 1024)
|
||||||
var token: String = uninitialized
|
var token: String = uninitialized
|
||||||
|
|
||||||
var rating: Int = 1500
|
var rating: Int = 1500
|
||||||
@@ -75,4 +75,7 @@ class OfficialBotAccount extends PanacheEntityBase:
|
|||||||
var rating: Int = 1500
|
var rating: Int = 1500
|
||||||
|
|
||||||
var createdAt: Instant = uninitialized
|
var createdAt: Instant = uninitialized
|
||||||
|
|
||||||
|
@Column(length = 1024)
|
||||||
|
var token: String = uninitialized
|
||||||
// scalafix:on
|
// scalafix:on
|
||||||
|
|||||||
@@ -4,13 +4,15 @@ case class RegisterRequest(username: String, email: String, password: String)
|
|||||||
|
|
||||||
case class LoginRequest(username: String, password: String)
|
case class LoginRequest(username: String, password: String)
|
||||||
|
|
||||||
case class TokenResponse(token: String)
|
case class RefreshRequest(refreshToken: String)
|
||||||
|
|
||||||
|
case class TokenPairResponse(accessToken: String, refreshToken: String)
|
||||||
|
|
||||||
case class PlayerInfo(id: String, name: String, rating: Int)
|
case class PlayerInfo(id: String, name: String, rating: Int)
|
||||||
|
|
||||||
case class PublicAccountDto(id: String, username: String, rating: Int, createdAt: String)
|
case class PublicAccountDto(id: String, username: String, rating: Int, createdAt: String)
|
||||||
|
|
||||||
case class TimeControlDto(`type`: String, limit: Option[Int], increment: Option[Int])
|
case class TimeControlDto(limitSeconds: Option[Int], incrementSeconds: Option[Int], daysPerMove: Option[Int])
|
||||||
|
|
||||||
case class ChallengeRequest(color: String, timeControl: TimeControlDto)
|
case class ChallengeRequest(color: String, timeControl: TimeControlDto)
|
||||||
|
|
||||||
@@ -44,6 +46,8 @@ case class BotAccountWithTokenDto(id: String, name: String, rating: Int, token:
|
|||||||
|
|
||||||
case class RotatedTokenDto(token: String)
|
case class RotatedTokenDto(token: String)
|
||||||
|
|
||||||
case class OfficialBotAccountDto(id: String, name: String, rating: Int, createdAt: String)
|
case class OfficialBotAccountDto(id: String, name: String, rating: Int, createdAt: String, token: Option[String] = None)
|
||||||
|
|
||||||
case class OfficialChallengeResponse(gameId: String, botName: String, difficulty: Int)
|
case class OfficialChallengeResponse(gameId: String, botName: String, difficulty: Int)
|
||||||
|
|
||||||
|
case class SyncOfficialBotsRequest(bots: List[String])
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ enum AccountError:
|
|||||||
case UsernameTaken(username: String)
|
case UsernameTaken(username: String)
|
||||||
case EmailAlreadyRegistered(email: String)
|
case EmailAlreadyRegistered(email: String)
|
||||||
case InvalidCredentials
|
case InvalidCredentials
|
||||||
|
case InvalidRefreshToken
|
||||||
case UserNotFound
|
case UserNotFound
|
||||||
case BotNotFound
|
case BotNotFound
|
||||||
case BotLimitExceeded
|
case BotLimitExceeded
|
||||||
@@ -15,6 +16,7 @@ enum AccountError:
|
|||||||
case UsernameTaken(u) => s"Username '$u' is already taken"
|
case UsernameTaken(u) => s"Username '$u' is already taken"
|
||||||
case EmailAlreadyRegistered(e) => s"Email '$e' is already registered"
|
case EmailAlreadyRegistered(e) => s"Email '$e' is already registered"
|
||||||
case InvalidCredentials => "Invalid credentials"
|
case InvalidCredentials => "Invalid credentials"
|
||||||
|
case InvalidRefreshToken => "Invalid or expired refresh token"
|
||||||
case UserNotFound => "User not found"
|
case UserNotFound => "User not found"
|
||||||
case BotNotFound => "Bot account not found"
|
case BotNotFound => "Bot account not found"
|
||||||
case BotLimitExceeded => "Maximum of 5 bot accounts per user exceeded"
|
case BotLimitExceeded => "Maximum of 5 bot accounts per user exceeded"
|
||||||
|
|||||||
@@ -89,6 +89,13 @@ class OfficialBotAccountRepository:
|
|||||||
def findAll(): List[OfficialBotAccount] =
|
def findAll(): List[OfficialBotAccount] =
|
||||||
em.createQuery("FROM OfficialBotAccount", classOf[OfficialBotAccount]).getResultList.asScala.toList
|
em.createQuery("FROM OfficialBotAccount", classOf[OfficialBotAccount]).getResultList.asScala.toList
|
||||||
|
|
||||||
|
def findByName(name: String): Option[OfficialBotAccount] =
|
||||||
|
em.createQuery("FROM OfficialBotAccount WHERE name = :name", classOf[OfficialBotAccount])
|
||||||
|
.setParameter("name", name)
|
||||||
|
.getResultList
|
||||||
|
.asScala
|
||||||
|
.headOption
|
||||||
|
|
||||||
def persist(bot: OfficialBotAccount): OfficialBotAccount =
|
def persist(bot: OfficialBotAccount): OfficialBotAccount =
|
||||||
em.persist(bot)
|
em.persist(bot)
|
||||||
bot
|
bot
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import de.nowchess.account.domain.{BotAccount, OfficialBotAccount, UserAccount}
|
|||||||
import de.nowchess.account.dto.*
|
import de.nowchess.account.dto.*
|
||||||
import de.nowchess.account.error.AccountError
|
import de.nowchess.account.error.AccountError
|
||||||
import de.nowchess.account.service.AccountService
|
import de.nowchess.account.service.AccountService
|
||||||
|
import de.nowchess.security.InternalOnly
|
||||||
import jakarta.annotation.security.RolesAllowed
|
import jakarta.annotation.security.RolesAllowed
|
||||||
import jakarta.enterprise.context.ApplicationScoped
|
import jakarta.enterprise.context.ApplicationScoped
|
||||||
import jakarta.inject.Inject
|
import jakarta.inject.Inject
|
||||||
@@ -40,8 +41,19 @@ class AccountResource:
|
|||||||
@Path("/login")
|
@Path("/login")
|
||||||
def login(req: LoginRequest): Response =
|
def login(req: LoginRequest): Response =
|
||||||
accountService.login(req) match
|
accountService.login(req) match
|
||||||
case Right(token) =>
|
case Right((accessToken, refreshToken)) =>
|
||||||
Response.ok(TokenResponse(token)).build()
|
Response.ok(TokenPairResponse(accessToken, refreshToken)).build()
|
||||||
|
case Left(AccountError.UserBanned) =>
|
||||||
|
Response.status(Response.Status.FORBIDDEN).entity(ErrorDto(AccountError.UserBanned.message)).build()
|
||||||
|
case Left(error) =>
|
||||||
|
Response.status(Response.Status.UNAUTHORIZED).entity(ErrorDto(error.message)).build()
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/refresh")
|
||||||
|
def refresh(req: RefreshRequest): Response =
|
||||||
|
accountService.refresh(req.refreshToken) match
|
||||||
|
case Right((accessToken, refreshToken)) =>
|
||||||
|
Response.ok(TokenPairResponse(accessToken, refreshToken)).build()
|
||||||
case Left(AccountError.UserBanned) =>
|
case Left(AccountError.UserBanned) =>
|
||||||
Response.status(Response.Status.FORBIDDEN).entity(ErrorDto(AccountError.UserBanned.message)).build()
|
Response.status(Response.Status.FORBIDDEN).entity(ErrorDto(AccountError.UserBanned.message)).build()
|
||||||
case Left(error) =>
|
case Left(error) =>
|
||||||
@@ -168,6 +180,13 @@ class AccountResource:
|
|||||||
createdAt = bot.createdAt.toString,
|
createdAt = bot.createdAt.toString,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/official-bots/sync")
|
||||||
|
@InternalOnly
|
||||||
|
def syncOfficialBots(req: SyncOfficialBotsRequest): Response =
|
||||||
|
accountService.syncOfficialBots(req.bots)
|
||||||
|
Response.noContent().build()
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/official-bots")
|
@Path("/official-bots")
|
||||||
def getOfficialBots: Response =
|
def getOfficialBots: Response =
|
||||||
@@ -180,7 +199,7 @@ class AccountResource:
|
|||||||
def createOfficialBot(req: CreateBotAccountRequest): Response =
|
def createOfficialBot(req: CreateBotAccountRequest): Response =
|
||||||
accountService.createOfficialBotAccount(req.name) match
|
accountService.createOfficialBotAccount(req.name) match
|
||||||
case Right(bot) =>
|
case Right(bot) =>
|
||||||
Response.status(Response.Status.CREATED).entity(toOfficialBotDto(bot)).build()
|
Response.status(Response.Status.CREATED).entity(toOfficialBotDtoWithToken(bot)).build()
|
||||||
case Left(error) =>
|
case Left(error) =>
|
||||||
Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ErrorDto(error.message)).build()
|
Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ErrorDto(error.message)).build()
|
||||||
|
|
||||||
@@ -200,3 +219,12 @@ class AccountResource:
|
|||||||
rating = bot.rating,
|
rating = bot.rating,
|
||||||
createdAt = bot.createdAt.toString,
|
createdAt = bot.createdAt.toString,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private def toOfficialBotDtoWithToken(bot: OfficialBotAccount): OfficialBotAccountDto =
|
||||||
|
OfficialBotAccountDto(
|
||||||
|
id = bot.id.toString,
|
||||||
|
name = bot.name,
|
||||||
|
rating = bot.rating,
|
||||||
|
createdAt = bot.createdAt.toString,
|
||||||
|
token = Some(bot.token),
|
||||||
|
)
|
||||||
|
|||||||
+4
-6
@@ -1,6 +1,6 @@
|
|||||||
package de.nowchess.account.resource
|
package de.nowchess.account.resource
|
||||||
|
|
||||||
import de.nowchess.account.client.{CoreCreateGameRequest, CoreGameClient, CorePlayerInfo}
|
import de.nowchess.account.client.{CoreCreateGameRequest, CorePlayerInfo, GameCreationStreamClient}
|
||||||
import de.nowchess.account.dto.{ErrorDto, OfficialChallengeResponse}
|
import de.nowchess.account.dto.{ErrorDto, OfficialChallengeResponse}
|
||||||
import de.nowchess.account.service.{AccountService, EventPublisher}
|
import de.nowchess.account.service.{AccountService, EventPublisher}
|
||||||
import jakarta.annotation.security.RolesAllowed
|
import jakarta.annotation.security.RolesAllowed
|
||||||
@@ -9,7 +9,6 @@ import jakarta.inject.Inject
|
|||||||
import jakarta.ws.rs.*
|
import jakarta.ws.rs.*
|
||||||
import jakarta.ws.rs.core.{MediaType, Response}
|
import jakarta.ws.rs.core.{MediaType, Response}
|
||||||
import org.eclipse.microprofile.jwt.JsonWebToken
|
import org.eclipse.microprofile.jwt.JsonWebToken
|
||||||
import org.eclipse.microprofile.rest.client.inject.RestClient
|
|
||||||
import org.jboss.logging.Logger
|
import org.jboss.logging.Logger
|
||||||
import scala.compiletime.uninitialized
|
import scala.compiletime.uninitialized
|
||||||
|
|
||||||
@@ -29,8 +28,7 @@ class OfficialChallengeResource:
|
|||||||
@Inject var botEventPublisher: EventPublisher = uninitialized
|
@Inject var botEventPublisher: EventPublisher = uninitialized
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@RestClient
|
var gameCreationClient: GameCreationStreamClient = uninitialized
|
||||||
var coreGameClient: CoreGameClient = uninitialized
|
|
||||||
// scalafix:on
|
// scalafix:on
|
||||||
|
|
||||||
private val log = Logger.getLogger(classOf[OfficialChallengeResource])
|
private val log = Logger.getLogger(classOf[OfficialChallengeResource])
|
||||||
@@ -72,14 +70,14 @@ class OfficialChallengeResource:
|
|||||||
(CorePlayerInfo(bot.id.toString, bot.name), CorePlayerInfo(user.id.toString, user.username), "white")
|
(CorePlayerInfo(bot.id.toString, bot.name), CorePlayerInfo(user.id.toString, user.username), "white")
|
||||||
val req = CoreCreateGameRequest(Some(white), Some(black), None, Some("Authenticated"))
|
val req = CoreCreateGameRequest(Some(white), Some(black), None, Some("Authenticated"))
|
||||||
val gameId =
|
val gameId =
|
||||||
try Right(coreGameClient.createGame(req).gameId)
|
try gameCreationClient.createGame(req).gameId.toRight("Failed to create game")
|
||||||
catch case _ => Left("Failed to create game")
|
catch case _ => Left("Failed to create game")
|
||||||
gameId match
|
gameId match
|
||||||
case Left(err) =>
|
case Left(err) =>
|
||||||
Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ErrorDto(err)).build()
|
Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ErrorDto(err)).build()
|
||||||
case Right(id) =>
|
case Right(id) =>
|
||||||
try botEventPublisher.publishGameStart(bot.name, id, botColor, difficulty, bot.id.toString)
|
try botEventPublisher.publishGameStart(bot.name, id, botColor, difficulty, bot.id.toString)
|
||||||
catch case ex: Exception => log.warnf(ex, "Failed to notify bot for game %s", id)
|
catch case ex: Exception => log.errorf(ex, "Failed to notify bot for game %s", id)
|
||||||
Response
|
Response
|
||||||
.status(Response.Status.CREATED)
|
.status(Response.Status.CREATED)
|
||||||
.entity(OfficialChallengeResponse(id, botName, difficulty))
|
.entity(OfficialChallengeResponse(id, botName, difficulty))
|
||||||
|
|||||||
@@ -4,11 +4,15 @@ import de.nowchess.account.domain.{BotAccount, OfficialBotAccount, UserAccount}
|
|||||||
import de.nowchess.account.dto.{LoginRequest, RegisterRequest}
|
import de.nowchess.account.dto.{LoginRequest, RegisterRequest}
|
||||||
import de.nowchess.account.error.AccountError
|
import de.nowchess.account.error.AccountError
|
||||||
import de.nowchess.account.repository.{BotAccountRepository, OfficialBotAccountRepository, UserAccountRepository}
|
import de.nowchess.account.repository.{BotAccountRepository, OfficialBotAccountRepository, UserAccountRepository}
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry
|
||||||
import io.quarkus.elytron.security.common.BcryptUtil
|
import io.quarkus.elytron.security.common.BcryptUtil
|
||||||
|
import io.smallrye.jwt.auth.principal.JWTParser
|
||||||
import io.smallrye.jwt.build.Jwt
|
import io.smallrye.jwt.build.Jwt
|
||||||
|
import jakarta.annotation.PostConstruct
|
||||||
import jakarta.enterprise.context.ApplicationScoped
|
import jakarta.enterprise.context.ApplicationScoped
|
||||||
import jakarta.inject.Inject
|
import jakarta.inject.Inject
|
||||||
import jakarta.transaction.Transactional
|
import jakarta.transaction.Transactional
|
||||||
|
import org.jboss.logging.Logger
|
||||||
import scala.compiletime.uninitialized
|
import scala.compiletime.uninitialized
|
||||||
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
@@ -17,6 +21,8 @@ import java.util.UUID
|
|||||||
@ApplicationScoped
|
@ApplicationScoped
|
||||||
class AccountService:
|
class AccountService:
|
||||||
|
|
||||||
|
private val log = Logger.getLogger(classOf[AccountService])
|
||||||
|
|
||||||
// scalafix:off DisableSyntax.var
|
// scalafix:off DisableSyntax.var
|
||||||
@Inject
|
@Inject
|
||||||
var userAccountRepository: UserAccountRepository = uninitialized
|
var userAccountRepository: UserAccountRepository = uninitialized
|
||||||
@@ -26,10 +32,31 @@ class AccountService:
|
|||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
var officialBotAccountRepository: OfficialBotAccountRepository = uninitialized
|
var officialBotAccountRepository: OfficialBotAccountRepository = uninitialized
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
var meterRegistry: MeterRegistry = uninitialized
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
var jwtParser: JWTParser = uninitialized
|
||||||
// scalafix:on
|
// scalafix:on
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
def initializeMetrics(): Unit =
|
||||||
|
meterRegistry.counter("nowchess.users.registrations", "result", "success").increment(0)
|
||||||
|
meterRegistry.counter("nowchess.users.registrations", "result", "failure").increment(0)
|
||||||
|
meterRegistry.counter("nowchess.auth.logins", "result", "success").increment(0)
|
||||||
|
meterRegistry.counter("nowchess.auth.logins", "result", "failure").increment(0)
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
def register(req: RegisterRequest): Either[AccountError, UserAccount] =
|
def register(req: RegisterRequest): Either[AccountError, UserAccount] =
|
||||||
|
log.infof("Registering user %s", req.username)
|
||||||
|
val result = registerAccount(req)
|
||||||
|
result match
|
||||||
|
case Right(_) => meterRegistry.counter("nowchess.users.registrations", "result", "success").increment()
|
||||||
|
case Left(_) => meterRegistry.counter("nowchess.users.registrations", "result", "failure").increment()
|
||||||
|
result
|
||||||
|
|
||||||
|
private def registerAccount(req: RegisterRequest): Either[AccountError, UserAccount] =
|
||||||
if userAccountRepository.findByUsername(req.username).isDefined then Left(AccountError.UsernameTaken(req.username))
|
if userAccountRepository.findByUsername(req.username).isDefined then Left(AccountError.UsernameTaken(req.username))
|
||||||
else if userAccountRepository.findByEmail(req.email).isDefined then
|
else if userAccountRepository.findByEmail(req.email).isDefined then
|
||||||
Left(AccountError.EmailAlreadyRegistered(req.email))
|
Left(AccountError.EmailAlreadyRegistered(req.email))
|
||||||
@@ -40,22 +67,73 @@ class AccountService:
|
|||||||
account.passwordHash = BcryptUtil.bcryptHash(req.password)
|
account.passwordHash = BcryptUtil.bcryptHash(req.password)
|
||||||
account.createdAt = Instant.now()
|
account.createdAt = Instant.now()
|
||||||
userAccountRepository.persist(account)
|
userAccountRepository.persist(account)
|
||||||
|
log.infof("User %s registered successfully", req.username)
|
||||||
Right(account)
|
Right(account)
|
||||||
|
|
||||||
def login(req: LoginRequest): Either[AccountError, String] =
|
def login(req: LoginRequest): Either[AccountError, (String, String)] =
|
||||||
|
val result = authenticateUser(req)
|
||||||
|
result match
|
||||||
|
case Right(_) => meterRegistry.counter("nowchess.auth.logins", "result", "success").increment()
|
||||||
|
case Left(error) =>
|
||||||
|
meterRegistry.counter("nowchess.auth.logins", "result", "failure").increment()
|
||||||
|
meterRegistry.counter("nowchess.auth.login.failures", "reason", loginFailureReason(error)).increment()
|
||||||
|
result
|
||||||
|
|
||||||
|
private def authenticateUser(req: LoginRequest): Either[AccountError, (String, String)] =
|
||||||
userAccountRepository.findByUsername(req.username) match
|
userAccountRepository.findByUsername(req.username) match
|
||||||
case None => Left(AccountError.InvalidCredentials)
|
case None =>
|
||||||
|
log.warnf("Login failed for unknown user %s", req.username)
|
||||||
|
Left(AccountError.InvalidCredentials)
|
||||||
case Some(account) =>
|
case Some(account) =>
|
||||||
if !BcryptUtil.matches(req.password, account.passwordHash) then Left(AccountError.InvalidCredentials)
|
if !BcryptUtil.matches(req.password, account.passwordHash) then
|
||||||
else if account.banned then Left(AccountError.UserBanned)
|
log.warnf("Login failed — invalid credentials for %s", req.username)
|
||||||
|
Left(AccountError.InvalidCredentials)
|
||||||
|
else if account.banned then
|
||||||
|
log.warnf("Login rejected — user %s is banned", req.username)
|
||||||
|
Left(AccountError.UserBanned)
|
||||||
else
|
else
|
||||||
Right(
|
log.infof("User %s logged in successfully", req.username)
|
||||||
Jwt
|
Right((generateAccessToken(account), generateRefreshToken(account.id)))
|
||||||
.issuer("nowchess")
|
|
||||||
.subject(account.id.toString)
|
def refresh(refreshToken: String): Either[AccountError, (String, String)] =
|
||||||
.claim("username", account.username)
|
try
|
||||||
.sign(),
|
val parsed = jwtParser.parse(refreshToken)
|
||||||
)
|
if parsed.getClaim[String]("type") != "refresh" then Left(AccountError.InvalidRefreshToken)
|
||||||
|
else
|
||||||
|
val userId = UUID.fromString(parsed.getSubject)
|
||||||
|
userAccountRepository.findById(userId) match
|
||||||
|
case None => Left(AccountError.UserNotFound)
|
||||||
|
case Some(u) if u.banned => Left(AccountError.UserBanned)
|
||||||
|
case Some(u) => Right((generateAccessToken(u), generateRefreshToken(u.id)))
|
||||||
|
catch case _: Throwable => Left(AccountError.InvalidRefreshToken)
|
||||||
|
|
||||||
|
private def generateAccessToken(account: UserAccount): String =
|
||||||
|
Jwt
|
||||||
|
.issuer("nowchess")
|
||||||
|
.subject(account.id.toString)
|
||||||
|
.claim("username", account.username)
|
||||||
|
.expiresIn(3600)
|
||||||
|
.sign()
|
||||||
|
|
||||||
|
private def generateRefreshToken(userId: UUID): String =
|
||||||
|
Jwt
|
||||||
|
.issuer("nowchess")
|
||||||
|
.subject(userId.toString)
|
||||||
|
.claim("type", "refresh")
|
||||||
|
.expiresIn(30L * 24 * 3600)
|
||||||
|
.sign()
|
||||||
|
|
||||||
|
private def loginFailureReason(error: AccountError): String = error match
|
||||||
|
case AccountError.InvalidCredentials => "invalid_credentials"
|
||||||
|
case AccountError.InvalidRefreshToken => "invalid_refresh_token"
|
||||||
|
case AccountError.UserBanned => "user_banned"
|
||||||
|
case AccountError.UsernameTaken(_) => "username_taken"
|
||||||
|
case AccountError.EmailAlreadyRegistered(_) => "email_registered"
|
||||||
|
case AccountError.UserNotFound => "user_not_found"
|
||||||
|
case AccountError.BotNotFound => "bot_not_found"
|
||||||
|
case AccountError.BotLimitExceeded => "bot_limit_exceeded"
|
||||||
|
case AccountError.NotAuthorized => "not_authorized"
|
||||||
|
case AccountError.BotBanned => "bot_banned"
|
||||||
|
|
||||||
def findByUsername(username: String): Option[UserAccount] =
|
def findByUsername(username: String): Option[UserAccount] =
|
||||||
userAccountRepository.findByUsername(username)
|
userAccountRepository.findByUsername(username)
|
||||||
@@ -65,6 +143,7 @@ class AccountService:
|
|||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
def createBotAccount(ownerId: UUID, botName: String): Either[AccountError, BotAccount] =
|
def createBotAccount(ownerId: UUID, botName: String): Either[AccountError, BotAccount] =
|
||||||
|
log.infof("Creating bot account %s for owner %s", botName, ownerId.toString)
|
||||||
userAccountRepository.findById(ownerId) match
|
userAccountRepository.findById(ownerId) match
|
||||||
case None => Left(AccountError.UserNotFound)
|
case None => Left(AccountError.UserNotFound)
|
||||||
case Some(owner) =>
|
case Some(owner) =>
|
||||||
@@ -74,9 +153,11 @@ class AccountService:
|
|||||||
val bot = new BotAccount()
|
val bot = new BotAccount()
|
||||||
bot.name = botName
|
bot.name = botName
|
||||||
bot.owner = owner
|
bot.owner = owner
|
||||||
bot.token = generateBotToken(bot.id)
|
bot.token = UUID.randomUUID().toString
|
||||||
bot.createdAt = Instant.now()
|
bot.createdAt = Instant.now()
|
||||||
botAccountRepository.persist(bot)
|
botAccountRepository.persist(bot)
|
||||||
|
bot.token = generateBotToken(bot.id, bot.name)
|
||||||
|
log.infof("Bot account %s created for owner %s", botName, ownerId.toString)
|
||||||
Right(bot)
|
Right(bot)
|
||||||
|
|
||||||
def getBotAccounts(ownerId: UUID): List[BotAccount] =
|
def getBotAccounts(ownerId: UUID): List[BotAccount] =
|
||||||
@@ -93,6 +174,7 @@ class AccountService:
|
|||||||
case None => Left(AccountError.BotNotFound)
|
case None => Left(AccountError.BotNotFound)
|
||||||
case Some(_) =>
|
case Some(_) =>
|
||||||
botAccountRepository.delete(botId)
|
botAccountRepository.delete(botId)
|
||||||
|
log.infof("Deleting bot account %s", botId.toString)
|
||||||
Right(())
|
Right(())
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@@ -113,7 +195,7 @@ class AccountService:
|
|||||||
case Some(bot) =>
|
case Some(bot) =>
|
||||||
if bot.owner.id != ownerId then Left(AccountError.NotAuthorized)
|
if bot.owner.id != ownerId then Left(AccountError.NotAuthorized)
|
||||||
else
|
else
|
||||||
bot.token = generateBotToken(botId)
|
bot.token = generateBotToken(botId, bot.name)
|
||||||
botAccountRepository.persist(bot)
|
botAccountRepository.persist(bot)
|
||||||
Right(bot)
|
Right(bot)
|
||||||
|
|
||||||
@@ -123,8 +205,23 @@ class AccountService:
|
|||||||
bot.name = botName
|
bot.name = botName
|
||||||
bot.createdAt = Instant.now()
|
bot.createdAt = Instant.now()
|
||||||
officialBotAccountRepository.persist(bot)
|
officialBotAccountRepository.persist(bot)
|
||||||
|
bot.token = generateBotToken(bot.id, bot.name)
|
||||||
|
officialBotAccountRepository.persist(bot)
|
||||||
Right(bot)
|
Right(bot)
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
def syncOfficialBots(botNames: List[String]): Unit =
|
||||||
|
botNames.foreach { name =>
|
||||||
|
if officialBotAccountRepository.findByName(name).isEmpty then
|
||||||
|
val bot = new OfficialBotAccount()
|
||||||
|
bot.name = name
|
||||||
|
bot.createdAt = Instant.now()
|
||||||
|
officialBotAccountRepository.persist(bot)
|
||||||
|
bot.token = generateBotToken(bot.id, bot.name)
|
||||||
|
officialBotAccountRepository.persist(bot)
|
||||||
|
log.infof("Auto-registered official bot: %s", name)
|
||||||
|
}
|
||||||
|
|
||||||
def getOfficialBotAccounts(): List[OfficialBotAccount] =
|
def getOfficialBotAccounts(): List[OfficialBotAccount] =
|
||||||
officialBotAccountRepository.findAll()
|
officialBotAccountRepository.findAll()
|
||||||
|
|
||||||
@@ -136,16 +233,18 @@ class AccountService:
|
|||||||
officialBotAccountRepository.delete(botId)
|
officialBotAccountRepository.delete(botId)
|
||||||
Right(())
|
Right(())
|
||||||
|
|
||||||
private def generateBotToken(botId: UUID): String =
|
private def generateBotToken(botId: UUID, botName: String): String =
|
||||||
Jwt
|
Jwt
|
||||||
.issuer("nowchess")
|
.issuer("nowchess")
|
||||||
.subject(botId.toString)
|
.subject(botId.toString)
|
||||||
.expiresAt(Long.MaxValue)
|
.expiresAt(Long.MaxValue)
|
||||||
.claim("type", "bot")
|
.claim("type", "bot")
|
||||||
|
.claim("name", botName)
|
||||||
.sign()
|
.sign()
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
def banUser(userId: UUID): Either[AccountError, UserAccount] =
|
def banUser(userId: UUID): Either[AccountError, UserAccount] =
|
||||||
|
log.infof("Banning user %s", userId.toString)
|
||||||
userAccountRepository.findById(userId) match
|
userAccountRepository.findById(userId) match
|
||||||
case None => Left(AccountError.UserNotFound)
|
case None => Left(AccountError.UserNotFound)
|
||||||
case Some(user) =>
|
case Some(user) =>
|
||||||
@@ -156,6 +255,7 @@ class AccountService:
|
|||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
def unbanUser(userId: UUID): Either[AccountError, UserAccount] =
|
def unbanUser(userId: UUID): Either[AccountError, UserAccount] =
|
||||||
|
log.infof("Unbanning user %s", userId.toString)
|
||||||
userAccountRepository.findById(userId) match
|
userAccountRepository.findById(userId) match
|
||||||
case None => Left(AccountError.UserNotFound)
|
case None => Left(AccountError.UserNotFound)
|
||||||
case Some(user) =>
|
case Some(user) =>
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
package de.nowchess.account.service
|
package de.nowchess.account.service
|
||||||
|
|
||||||
import de.nowchess.account.client.{
|
import de.nowchess.account.client.{CoreCreateGameRequest, CorePlayerInfo, CoreTimeControl, GameCreationStreamClient}
|
||||||
CoreCreateGameRequest,
|
|
||||||
CoreGameClient,
|
|
||||||
CoreGameResponse,
|
|
||||||
CorePlayerInfo,
|
|
||||||
CoreTimeControl,
|
|
||||||
}
|
|
||||||
import de.nowchess.account.domain.{Challenge, ChallengeColor, ChallengeStatus, DeclineReason}
|
import de.nowchess.account.domain.{Challenge, ChallengeColor, ChallengeStatus, DeclineReason}
|
||||||
import de.nowchess.account.dto.{
|
import de.nowchess.account.dto.{
|
||||||
ChallengeDto,
|
ChallengeDto,
|
||||||
@@ -18,10 +12,11 @@ import de.nowchess.account.dto.{
|
|||||||
}
|
}
|
||||||
import de.nowchess.account.error.ChallengeError
|
import de.nowchess.account.error.ChallengeError
|
||||||
import de.nowchess.account.repository.{ChallengeRepository, UserAccountRepository}
|
import de.nowchess.account.repository.{ChallengeRepository, UserAccountRepository}
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry
|
||||||
|
import jakarta.annotation.PostConstruct
|
||||||
import jakarta.enterprise.context.ApplicationScoped
|
import jakarta.enterprise.context.ApplicationScoped
|
||||||
import jakarta.inject.Inject
|
import jakarta.inject.Inject
|
||||||
import jakarta.transaction.Transactional
|
import jakarta.transaction.Transactional
|
||||||
import org.eclipse.microprofile.rest.client.inject.RestClient
|
|
||||||
import org.jboss.logging.Logger
|
import org.jboss.logging.Logger
|
||||||
import scala.compiletime.uninitialized
|
import scala.compiletime.uninitialized
|
||||||
|
|
||||||
@@ -43,15 +38,32 @@ class ChallengeService:
|
|||||||
var challengeRepository: ChallengeRepository = uninitialized
|
var challengeRepository: ChallengeRepository = uninitialized
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@RestClient
|
var gameCreationClient: GameCreationStreamClient = uninitialized
|
||||||
var coreGameClient: CoreGameClient = uninitialized
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
var eventPublisher: EventPublisher = uninitialized
|
var eventPublisher: EventPublisher = uninitialized
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
var meterRegistry: MeterRegistry = uninitialized
|
||||||
// scalafix:on
|
// scalafix:on
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
def initializeMetrics(): Unit =
|
||||||
|
meterRegistry.counter("nowchess.challenges.created").increment(0)
|
||||||
|
meterRegistry.counter("nowchess.challenges.accepted").increment(0)
|
||||||
|
meterRegistry.counter("nowchess.challenges.declined").increment(0)
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
def create(challengerId: UUID, destUsername: String, req: ChallengeRequest): Either[ChallengeError, Challenge] =
|
def create(challengerId: UUID, destUsername: String, req: ChallengeRequest): Either[ChallengeError, Challenge] =
|
||||||
|
val result = createChallenge(challengerId, destUsername, req)
|
||||||
|
result.foreach(_ => meterRegistry.counter("nowchess.challenges.created").increment())
|
||||||
|
result
|
||||||
|
|
||||||
|
private def createChallenge(
|
||||||
|
challengerId: UUID,
|
||||||
|
destUsername: String,
|
||||||
|
req: ChallengeRequest,
|
||||||
|
): Either[ChallengeError, Challenge] =
|
||||||
for
|
for
|
||||||
destUser <- userAccountRepository.findByUsername(destUsername).toRight(ChallengeError.UserNotFound(destUsername))
|
destUser <- userAccountRepository.findByUsername(destUsername).toRight(ChallengeError.UserNotFound(destUsername))
|
||||||
challenger <- userAccountRepository.findById(challengerId).toRight(ChallengeError.ChallengerNotFound)
|
challenger <- userAccountRepository.findById(challengerId).toRight(ChallengeError.ChallengerNotFound)
|
||||||
@@ -68,18 +80,23 @@ class ChallengeService:
|
|||||||
challenge.destUser = destUser
|
challenge.destUser = destUser
|
||||||
challenge.color = color
|
challenge.color = color
|
||||||
challenge.status = ChallengeStatus.Created
|
challenge.status = ChallengeStatus.Created
|
||||||
challenge.timeControlType = req.timeControl.`type`
|
challenge.limitSeconds = req.timeControl.limitSeconds.map(java.lang.Integer.valueOf).orNull
|
||||||
challenge.timeControlLimit = req.timeControl.limit.map(java.lang.Integer.valueOf).orNull
|
challenge.incrementSeconds = req.timeControl.incrementSeconds.map(java.lang.Integer.valueOf).orNull
|
||||||
challenge.timeControlIncrement = req.timeControl.increment.map(java.lang.Integer.valueOf).orNull
|
challenge.daysPerMove = req.timeControl.daysPerMove.map(java.lang.Integer.valueOf).orNull
|
||||||
challenge.createdAt = Instant.now()
|
challenge.createdAt = Instant.now()
|
||||||
challenge.expiresAt = Instant.now().plus(24, ChronoUnit.HOURS)
|
challenge.expiresAt = Instant.now().plus(24, ChronoUnit.HOURS)
|
||||||
challengeRepository.persist(challenge)
|
challengeRepository.persist(challenge)
|
||||||
try eventPublisher.publishChallengeCreated(destUser.id.toString, challenge.id.toString, challenger.username)
|
try eventPublisher.publishChallengeCreated(destUser.id.toString, challenge.id.toString, challenger.username)
|
||||||
catch case ex: Exception => log.warnf(ex, "Failed to notify dest user for challenge %s", challenge.id)
|
catch case ex: Exception => log.errorf(ex, "Failed to notify dest user for challenge %s", challenge.id)
|
||||||
challenge
|
challenge
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
def accept(challengeId: UUID, userId: UUID): Either[ChallengeError, Challenge] =
|
def accept(challengeId: UUID, userId: UUID): Either[ChallengeError, Challenge] =
|
||||||
|
val result = acceptChallenge(challengeId, userId)
|
||||||
|
result.foreach(_ => meterRegistry.counter("nowchess.challenges.accepted").increment())
|
||||||
|
result
|
||||||
|
|
||||||
|
private def acceptChallenge(challengeId: UUID, userId: UUID): Either[ChallengeError, Challenge] =
|
||||||
for
|
for
|
||||||
challenge <- challengeRepository.findById(challengeId).toRight(ChallengeError.ChallengeNotFound)
|
challenge <- challengeRepository.findById(challengeId).toRight(ChallengeError.ChallengeNotFound)
|
||||||
_ <- Either.cond(challenge.status == ChallengeStatus.Created, (), ChallengeError.ChallengeNotActive)
|
_ <- Either.cond(challenge.status == ChallengeStatus.Created, (), ChallengeError.ChallengeNotActive)
|
||||||
@@ -91,11 +108,20 @@ class ChallengeService:
|
|||||||
challengeRepository.merge(challenge)
|
challengeRepository.merge(challenge)
|
||||||
notifyBotIfNeeded(challenge, gameId)
|
notifyBotIfNeeded(challenge, gameId)
|
||||||
try eventPublisher.publishChallengeAccepted(challenge.challenger.id.toString, challenge.id.toString, gameId)
|
try eventPublisher.publishChallengeAccepted(challenge.challenger.id.toString, challenge.id.toString, gameId)
|
||||||
catch case ex: Exception => log.warnf(ex, "Failed to notify challenger for game %s", gameId)
|
catch case ex: Exception => log.errorf(ex, "Failed to notify challenger for game %s", gameId)
|
||||||
challenge
|
challenge
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
def decline(challengeId: UUID, userId: UUID, req: DeclineRequest): Either[ChallengeError, Challenge] =
|
def decline(challengeId: UUID, userId: UUID, req: DeclineRequest): Either[ChallengeError, Challenge] =
|
||||||
|
val result = declineChallenge(challengeId, userId, req)
|
||||||
|
result.foreach(_ => meterRegistry.counter("nowchess.challenges.declined").increment())
|
||||||
|
result
|
||||||
|
|
||||||
|
private def declineChallenge(
|
||||||
|
challengeId: UUID,
|
||||||
|
userId: UUID,
|
||||||
|
req: DeclineRequest,
|
||||||
|
): Either[ChallengeError, Challenge] =
|
||||||
for
|
for
|
||||||
challenge <- challengeRepository.findById(challengeId).toRight(ChallengeError.ChallengeNotFound)
|
challenge <- challengeRepository.findById(challengeId).toRight(ChallengeError.ChallengeNotFound)
|
||||||
_ <- Either.cond(challenge.status == ChallengeStatus.Created, (), ChallengeError.ChallengeNotActive)
|
_ <- Either.cond(challenge.status == ChallengeStatus.Created, (), ChallengeError.ChallengeNotActive)
|
||||||
@@ -109,6 +135,11 @@ class ChallengeService:
|
|||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
def cancel(challengeId: UUID, userId: UUID): Either[ChallengeError, Challenge] =
|
def cancel(challengeId: UUID, userId: UUID): Either[ChallengeError, Challenge] =
|
||||||
|
val result = cancelChallenge(challengeId, userId)
|
||||||
|
result.foreach(_ => meterRegistry.counter("nowchess.challenges.cancelled").increment())
|
||||||
|
result
|
||||||
|
|
||||||
|
private def cancelChallenge(challengeId: UUID, userId: UUID): Either[ChallengeError, Challenge] =
|
||||||
for
|
for
|
||||||
challenge <- challengeRepository.findById(challengeId).toRight(ChallengeError.ChallengeNotFound)
|
challenge <- challengeRepository.findById(challengeId).toRight(ChallengeError.ChallengeNotFound)
|
||||||
_ <- Either.cond(challenge.status == ChallengeStatus.Created, (), ChallengeError.ChallengeNotActive)
|
_ <- Either.cond(challenge.status == ChallengeStatus.Created, (), ChallengeError.ChallengeNotActive)
|
||||||
@@ -148,7 +179,7 @@ class ChallengeService:
|
|||||||
val (white, black) = assignColors(challenge)
|
val (white, black) = assignColors(challenge)
|
||||||
val tc = buildTimeControl(challenge)
|
val tc = buildTimeControl(challenge)
|
||||||
val req = CoreCreateGameRequest(Some(white), Some(black), tc, Some("Authenticated"))
|
val req = CoreCreateGameRequest(Some(white), Some(black), tc, Some("Authenticated"))
|
||||||
Right(coreGameClient.createGame(req).gameId)
|
gameCreationClient.createGame(req).gameId.toRight(ChallengeError.GameCreationFailed)
|
||||||
catch case _ => Left(ChallengeError.GameCreationFailed)
|
catch case _ => Left(ChallengeError.GameCreationFailed)
|
||||||
|
|
||||||
private def assignColors(challenge: Challenge): (CorePlayerInfo, CorePlayerInfo) =
|
private def assignColors(challenge: Challenge): (CorePlayerInfo, CorePlayerInfo) =
|
||||||
@@ -161,10 +192,9 @@ class ChallengeService:
|
|||||||
if ThreadLocalRandom.current().nextBoolean() then (challenger, destUser) else (destUser, challenger)
|
if ThreadLocalRandom.current().nextBoolean() then (challenger, destUser) else (destUser, challenger)
|
||||||
|
|
||||||
private def buildTimeControl(challenge: Challenge): Option[CoreTimeControl] =
|
private def buildTimeControl(challenge: Challenge): Option[CoreTimeControl] =
|
||||||
challenge.timeControlType match
|
if challenge.limitSecondsOpt.isEmpty && challenge.incrementSecondsOpt.isEmpty && challenge.daysPerMoveOpt.isEmpty
|
||||||
case "unlimited" => None
|
then None
|
||||||
case "correspondence" => Some(CoreTimeControl(None, None, challenge.timeControlLimitOpt))
|
else Some(CoreTimeControl(challenge.limitSecondsOpt, challenge.incrementSecondsOpt, challenge.daysPerMoveOpt))
|
||||||
case _ => Some(CoreTimeControl(challenge.timeControlLimitOpt, challenge.timeControlIncrementOpt, None))
|
|
||||||
|
|
||||||
private def parseColor(raw: String): Either[ChallengeError, ChallengeColor] =
|
private def parseColor(raw: String): Either[ChallengeError, ChallengeColor] =
|
||||||
raw.toLowerCase match
|
raw.toLowerCase match
|
||||||
@@ -188,7 +218,7 @@ class ChallengeService:
|
|||||||
destUser = PlayerInfo(c.destUser.id.toString, c.destUser.username, c.destUser.rating),
|
destUser = PlayerInfo(c.destUser.id.toString, c.destUser.username, c.destUser.rating),
|
||||||
variant = "standard",
|
variant = "standard",
|
||||||
color = c.color.toString.toLowerCase,
|
color = c.color.toString.toLowerCase,
|
||||||
timeControl = TimeControlDto(c.timeControlType, c.timeControlLimitOpt, c.timeControlIncrementOpt),
|
timeControl = TimeControlDto(c.limitSecondsOpt, c.incrementSecondsOpt, c.daysPerMoveOpt),
|
||||||
status = c.status.toString.toLowerCase,
|
status = c.status.toString.toLowerCase,
|
||||||
declineReason = c.declineReasonOpt.map(_.toString.toLowerCase),
|
declineReason = c.declineReasonOpt.map(_.toString.toLowerCase),
|
||||||
gameId = c.gameIdOpt,
|
gameId = c.gameIdOpt,
|
||||||
|
|||||||
@@ -1,31 +1,67 @@
|
|||||||
package de.nowchess.account.service
|
package de.nowchess.account.service
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
import de.nowchess.account.config.RedisConfig
|
import de.nowchess.account.config.RedisConfig
|
||||||
|
import de.nowchess.api.event.{EventEnvelope, EventType}
|
||||||
import io.quarkus.redis.datasource.RedisDataSource
|
import io.quarkus.redis.datasource.RedisDataSource
|
||||||
|
import io.quarkus.redis.datasource.stream.XAddArgs
|
||||||
import jakarta.enterprise.context.ApplicationScoped
|
import jakarta.enterprise.context.ApplicationScoped
|
||||||
import jakarta.inject.Inject
|
import jakarta.inject.Inject
|
||||||
import scala.compiletime.uninitialized
|
import scala.compiletime.uninitialized
|
||||||
|
import scala.jdk.CollectionConverters.*
|
||||||
|
|
||||||
@ApplicationScoped
|
@ApplicationScoped
|
||||||
class EventPublisher:
|
class EventPublisher:
|
||||||
|
|
||||||
// scalafix:off DisableSyntax.var
|
// scalafix:off DisableSyntax.var
|
||||||
@Inject var redis: RedisDataSource = uninitialized
|
@Inject var redis: RedisDataSource = uninitialized
|
||||||
@Inject var redisConfig: RedisConfig = uninitialized
|
@Inject var redisConfig: RedisConfig = uninitialized
|
||||||
|
@Inject var objectMapper: ObjectMapper = uninitialized
|
||||||
// scalafix:on DisableSyntax.var
|
// scalafix:on DisableSyntax.var
|
||||||
|
|
||||||
|
private val maxStreamLen = 1000L
|
||||||
|
|
||||||
def publishGameStart(botId: String, gameId: String, playingAs: String, difficulty: Int, botAccountId: String): Unit =
|
def publishGameStart(botId: String, gameId: String, playingAs: String, difficulty: Int, botAccountId: String): Unit =
|
||||||
val event =
|
val payload = objectMapper.createObjectNode()
|
||||||
s"""{"type":"gameStart","gameId":"$gameId","playingAs":"$playingAs","difficulty":$difficulty,"botAccountId":"$botAccountId"}"""
|
payload.put("gameId", gameId)
|
||||||
redis.pubsub(classOf[String]).publish(s"${redisConfig.prefix}:bot:$botId:events", event)
|
payload.put("playingAs", playingAs)
|
||||||
|
payload.put("difficulty", difficulty)
|
||||||
|
payload.put("botAccountId", botAccountId)
|
||||||
|
val envelope = EventEnvelope.of(EventType.BotGameStart, payload)
|
||||||
|
val json = objectMapper.writeValueAsString(envelope)
|
||||||
|
redis
|
||||||
|
.stream(classOf[String])
|
||||||
|
.xadd(
|
||||||
|
s"${redisConfig.prefix}:bot:$botId:events:stream",
|
||||||
|
new XAddArgs().maxlen(maxStreamLen).nearlyExactTrimming(),
|
||||||
|
Map("data" -> json).asJava,
|
||||||
|
)
|
||||||
()
|
()
|
||||||
|
|
||||||
def publishChallengeCreated(destUserId: String, challengeId: String, challengerName: String): Unit =
|
def publishChallengeCreated(destUserId: String, challengeId: String, challengerName: String): Unit =
|
||||||
val event = s"""{"type":"challengeCreated","challengeId":"$challengeId","challengerName":"$challengerName"}"""
|
val payload = objectMapper.createObjectNode()
|
||||||
redis.pubsub(classOf[String]).publish(s"${redisConfig.prefix}:user:$destUserId:events", event)
|
payload.put("challengeId", challengeId)
|
||||||
()
|
payload.put("challengerName", challengerName)
|
||||||
|
publishToUserStream(destUserId, EventType.ChallengeCreated, payload)
|
||||||
|
|
||||||
def publishChallengeAccepted(challengerId: String, challengeId: String, gameId: String): Unit =
|
def publishChallengeAccepted(challengerId: String, challengeId: String, gameId: String): Unit =
|
||||||
val event = s"""{"type":"challengeAccepted","challengeId":"$challengeId","gameId":"$gameId"}"""
|
val payload = objectMapper.createObjectNode()
|
||||||
redis.pubsub(classOf[String]).publish(s"${redisConfig.prefix}:user:$challengerId:events", event)
|
payload.put("challengeId", challengeId)
|
||||||
|
payload.put("gameId", gameId)
|
||||||
|
publishToUserStream(challengerId, EventType.ChallengeAccepted, payload)
|
||||||
|
|
||||||
|
private def publishToUserStream(
|
||||||
|
userId: String,
|
||||||
|
eventType: EventType,
|
||||||
|
payload: com.fasterxml.jackson.databind.node.ObjectNode,
|
||||||
|
): Unit =
|
||||||
|
val envelope = EventEnvelope.of(eventType, payload)
|
||||||
|
val json = objectMapper.writeValueAsString(envelope)
|
||||||
|
redis
|
||||||
|
.stream(classOf[String])
|
||||||
|
.xadd(
|
||||||
|
s"${redisConfig.prefix}:user:$userId:events:stream",
|
||||||
|
new XAddArgs().maxlen(maxStreamLen).nearlyExactTrimming(),
|
||||||
|
Map("data" -> json).asJava,
|
||||||
|
)
|
||||||
()
|
()
|
||||||
|
|||||||
@@ -34,3 +34,5 @@ nowchess:
|
|||||||
secret: test-secret
|
secret: test-secret
|
||||||
auth:
|
auth:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
game-creation-stream:
|
||||||
|
enabled: false
|
||||||
|
|||||||
+84
-3
@@ -32,7 +32,24 @@ class AccountResourceTest:
|
|||||||
.`then`()
|
.`then`()
|
||||||
.statusCode(200)
|
.statusCode(200)
|
||||||
.extract()
|
.extract()
|
||||||
.path[String]("token")
|
.path[String]("accessToken")
|
||||||
|
|
||||||
|
private def registerAndLoginPair(username: String): (String, String) =
|
||||||
|
givenRequest()
|
||||||
|
.body(registerBody(username))
|
||||||
|
.when()
|
||||||
|
.post("/api/account")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(200)
|
||||||
|
val resp = givenRequest()
|
||||||
|
.body(loginBody(username))
|
||||||
|
.when()
|
||||||
|
.post("/api/account/login")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(200)
|
||||||
|
.extract()
|
||||||
|
.response()
|
||||||
|
(resp.path[String]("accessToken"), resp.path[String]("refreshToken"))
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
def registerReturns200(): Unit =
|
def registerReturns200(): Unit =
|
||||||
@@ -57,7 +74,7 @@ class AccountResourceTest:
|
|||||||
.body("error", containsString("bob"))
|
.body("error", containsString("bob"))
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
def loginReturns200WithToken(): Unit =
|
def loginReturns200WithTokenPair(): Unit =
|
||||||
givenRequest().body(registerBody("charlie")).when().post("/api/account")
|
givenRequest().body(registerBody("charlie")).when().post("/api/account")
|
||||||
givenRequest()
|
givenRequest()
|
||||||
.body(loginBody("charlie"))
|
.body(loginBody("charlie"))
|
||||||
@@ -65,7 +82,8 @@ class AccountResourceTest:
|
|||||||
.post("/api/account/login")
|
.post("/api/account/login")
|
||||||
.`then`()
|
.`then`()
|
||||||
.statusCode(200)
|
.statusCode(200)
|
||||||
.body("token", notNullValue())
|
.body("accessToken", notNullValue())
|
||||||
|
.body("refreshToken", notNullValue())
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
def loginUnauthorizedOnWrongPassword(): Unit =
|
def loginUnauthorizedOnWrongPassword(): Unit =
|
||||||
@@ -105,3 +123,66 @@ class AccountResourceTest:
|
|||||||
.get("/api/account/doesnotexist")
|
.get("/api/account/doesnotexist")
|
||||||
.`then`()
|
.`then`()
|
||||||
.statusCode(404)
|
.statusCode(404)
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def refreshReturnsNewTokenPair(): Unit =
|
||||||
|
val (_, refreshToken) = registerAndLoginPair("refresh_user")
|
||||||
|
givenRequest()
|
||||||
|
.body(s"""{"refreshToken":"$refreshToken"}""")
|
||||||
|
.when()
|
||||||
|
.post("/api/account/refresh")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(200)
|
||||||
|
.body("accessToken", notNullValue())
|
||||||
|
.body("refreshToken", notNullValue())
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def refreshWithInvalidTokenReturns401(): Unit =
|
||||||
|
givenRequest()
|
||||||
|
.body("""{"refreshToken":"invalid.token.value"}""")
|
||||||
|
.when()
|
||||||
|
.post("/api/account/refresh")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(401)
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def refreshWithAccessTokenReturns401(): Unit =
|
||||||
|
val accessToken = registerAndLogin("refresh_bad_type")
|
||||||
|
givenRequest()
|
||||||
|
.body(s"""{"refreshToken":"$accessToken"}""")
|
||||||
|
.when()
|
||||||
|
.post("/api/account/refresh")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(401)
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def syncOfficialBotsCreatesNewBots(): Unit =
|
||||||
|
givenRequest()
|
||||||
|
.body("""{"bots":["sync-easy","sync-hard"]}""")
|
||||||
|
.when()
|
||||||
|
.post("/api/account/official-bots/sync")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(204)
|
||||||
|
RestAssured
|
||||||
|
.`given`()
|
||||||
|
.when()
|
||||||
|
.get("/api/account/official-bots")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(200)
|
||||||
|
.body("name", hasItems("sync-easy", "sync-hard"))
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def syncOfficialBotsIsIdempotent(): Unit =
|
||||||
|
val body = """{"bots":["idempotent-bot"]}"""
|
||||||
|
givenRequest()
|
||||||
|
.body(body)
|
||||||
|
.when()
|
||||||
|
.post("/api/account/official-bots/sync")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(204)
|
||||||
|
givenRequest()
|
||||||
|
.body(body)
|
||||||
|
.when()
|
||||||
|
.post("/api/account/official-bots/sync")
|
||||||
|
.`then`()
|
||||||
|
.statusCode(204)
|
||||||
|
|||||||
+8
-7
@@ -1,11 +1,11 @@
|
|||||||
package de.nowchess.account.resource
|
package de.nowchess.account.resource
|
||||||
|
|
||||||
import de.nowchess.account.client.{CoreGameClient, CoreGameResponse}
|
import de.nowchess.account.client.GameCreationStreamClient
|
||||||
|
import de.nowchess.api.dto.GameCreationResponseDto
|
||||||
import io.quarkus.test.InjectMock
|
import io.quarkus.test.InjectMock
|
||||||
import io.quarkus.test.junit.QuarkusTest
|
import io.quarkus.test.junit.QuarkusTest
|
||||||
import io.restassured.RestAssured
|
import io.restassured.RestAssured
|
||||||
import io.restassured.http.ContentType
|
import io.restassured.http.ContentType
|
||||||
import org.eclipse.microprofile.rest.client.inject.RestClient
|
|
||||||
import org.hamcrest.Matchers.*
|
import org.hamcrest.Matchers.*
|
||||||
import org.junit.jupiter.api.{BeforeEach, Test}
|
import org.junit.jupiter.api.{BeforeEach, Test}
|
||||||
import org.mockito.{ArgumentMatchers, Mockito}
|
import org.mockito.{ArgumentMatchers, Mockito}
|
||||||
@@ -14,14 +14,15 @@ import org.mockito.{ArgumentMatchers, Mockito}
|
|||||||
class ChallengeResourceTest:
|
class ChallengeResourceTest:
|
||||||
|
|
||||||
@InjectMock
|
@InjectMock
|
||||||
@RestClient
|
|
||||||
// scalafix:off DisableSyntax.var
|
// scalafix:off DisableSyntax.var
|
||||||
var coreGameClient: CoreGameClient = scala.compiletime.uninitialized
|
var gameCreationClient: GameCreationStreamClient = scala.compiletime.uninitialized
|
||||||
// scalafix:on
|
// scalafix:on
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
def setup(): Unit =
|
def setup(): Unit =
|
||||||
Mockito.when(coreGameClient.createGame(ArgumentMatchers.any())).thenReturn(CoreGameResponse("test-game-id"))
|
Mockito
|
||||||
|
.when(gameCreationClient.createGame(ArgumentMatchers.any()))
|
||||||
|
.thenReturn(GameCreationResponseDto(Some("test-game-id")))
|
||||||
|
|
||||||
private def givenRequest() = RestAssured.`given`().contentType(ContentType.JSON)
|
private def givenRequest() = RestAssured.`given`().contentType(ContentType.JSON)
|
||||||
|
|
||||||
@@ -41,10 +42,10 @@ class ChallengeResourceTest:
|
|||||||
.`then`()
|
.`then`()
|
||||||
.statusCode(200)
|
.statusCode(200)
|
||||||
.extract()
|
.extract()
|
||||||
.path[String]("token")
|
.path[String]("accessToken")
|
||||||
|
|
||||||
private val clockBody =
|
private val clockBody =
|
||||||
"""{"color":"random","timeControl":{"type":"clock","limit":300,"increment":5}}"""
|
"""{"color":"random","timeControl":{"limitSeconds":300,"incrementSeconds":5}}"""
|
||||||
|
|
||||||
private def authed(token: String) =
|
private def authed(token: String) =
|
||||||
givenRequest().header("Authorization", s"Bearer $token")
|
givenRequest().header("Authorization", s"Bearer $token")
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package de.nowchess.account.service
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
|
||||||
|
import de.nowchess.account.config.RedisConfig
|
||||||
|
import io.quarkus.redis.datasource.RedisDataSource
|
||||||
|
import io.quarkus.redis.datasource.stream.{StreamCommands, XAddArgs}
|
||||||
|
import org.junit.jupiter.api.{BeforeEach, Test}
|
||||||
|
import org.mockito.ArgumentMatchers.*
|
||||||
|
import org.mockito.Mockito.*
|
||||||
|
import scala.compiletime.uninitialized
|
||||||
|
|
||||||
|
class EventPublisherTest:
|
||||||
|
|
||||||
|
// scalafix:off DisableSyntax.var
|
||||||
|
private var redis: RedisDataSource = uninitialized
|
||||||
|
private var streamCmds: StreamCommands[String, String, Nothing] = uninitialized
|
||||||
|
private var redisConfig: RedisConfig = uninitialized
|
||||||
|
// scalafix:on DisableSyntax.var
|
||||||
|
|
||||||
|
private val objectMapper = new ObjectMapper().registerModule(new JavaTimeModule())
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
def setup(): Unit =
|
||||||
|
redis = mock(classOf[RedisDataSource])
|
||||||
|
streamCmds = mock(classOf[StreamCommands[String, String, Nothing]])
|
||||||
|
redisConfig = mock(classOf[RedisConfig])
|
||||||
|
when(redis.stream(classOf[String])).thenReturn(streamCmds)
|
||||||
|
when(redisConfig.prefix).thenReturn("nowchess")
|
||||||
|
|
||||||
|
private def publisher: EventPublisher =
|
||||||
|
val p = new EventPublisher
|
||||||
|
p.redis = redis
|
||||||
|
p.redisConfig = redisConfig
|
||||||
|
p.objectMapper = objectMapper
|
||||||
|
p
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def publishChallengeCreatedWritesToUserStream(): Unit =
|
||||||
|
publisher.publishChallengeCreated("user1", "ch1", "Alice")
|
||||||
|
verify(streamCmds).xadd(
|
||||||
|
org.mockito.ArgumentMatchers.eq("nowchess:user:user1:events:stream"),
|
||||||
|
any(classOf[XAddArgs]),
|
||||||
|
any(),
|
||||||
|
)
|
||||||
|
verify(redis, never()).pubsub(any(classOf[Class[?]]))
|
||||||
|
|
||||||
|
@Test
|
||||||
|
def publishChallengeAcceptedWritesToUserStream(): Unit =
|
||||||
|
publisher.publishChallengeAccepted("user2", "ch1", "game42")
|
||||||
|
verify(streamCmds).xadd(
|
||||||
|
org.mockito.ArgumentMatchers.eq("nowchess:user:user2:events:stream"),
|
||||||
|
any(classOf[XAddArgs]),
|
||||||
|
any(),
|
||||||
|
)
|
||||||
|
verify(redis, never()).pubsub(any(classOf[Class[?]]))
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
MAJOR=0
|
MAJOR=0
|
||||||
MINOR=3
|
MINOR=22
|
||||||
PATCH=0
|
PATCH=0
|
||||||
|
|||||||
@@ -109,3 +109,78 @@
|
|||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
* IO microservice ([#38](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/38)) ([a386f57](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a386f57c21d34ead6cc6f92836c52b714597e289))
|
* IO microservice ([#38](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/38)) ([a386f57](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a386f57c21d34ead6cc6f92836c52b714597e289))
|
||||||
|
## (2026-05-22)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **dto:** update GameWritebackEventDto for JSON deserialization and remove unused mixin ([576e3fe](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/576e3fea9bf1082549ea53efd3288474c42be93d))
|
||||||
|
* NCS-13 Implement Threefold Repetition ([#31](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/31)) ([767d305](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/767d3051a76c266050b6335774d66e2db2273c16))
|
||||||
|
* NCS-14 implemented insufficient moves rule ([#30](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/30)) ([b0399a4](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/b0399a4e489950083066c9538df9a84dcc7a4613))
|
||||||
|
* NCS-21 Write Scripts to automate certain tasks ([#15](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/15)) ([8051871](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/80518719d536a087d339fe02530825dc07f8b388))
|
||||||
|
* NCS-25 Add linters to keep quality up ([#27](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/27)) ([fd4e67d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/fd4e67d4f782a7e955822d90cb909d0a81676fb2))
|
||||||
|
* NCS-37 Quarkus integration ([#35](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/35)) ([f088c4e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/f088c4e9ffcc498d3d1b6f01e8f50042d5830d55))
|
||||||
|
* NCS-41 Bot Platform ([#33](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/33)) ([8744bee](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/8744bee2dd20966dae90a09c21a43d5b06f59e00))
|
||||||
|
* **rule:** Rules as a microservice ([#39](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/39)) ([093134d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/093134d36c6844ba02a36a28d5d044f09291cd1d))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **dependencies:** correct Jackson databind dependency group ID ([008d72d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/008d72d826707c04205bac7de25170fae5fed861))
|
||||||
|
* IO microservice ([#38](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/38)) ([a386f57](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a386f57c21d34ead6cc6f92836c52b714597e289))
|
||||||
|
## (2026-05-31)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **dto:** update GameWritebackEventDto for JSON deserialization and remove unused mixin ([576e3fe](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/576e3fea9bf1082549ea53efd3288474c42be93d))
|
||||||
|
* NCS-13 Implement Threefold Repetition ([#31](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/31)) ([767d305](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/767d3051a76c266050b6335774d66e2db2273c16))
|
||||||
|
* NCS-14 implemented insufficient moves rule ([#30](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/30)) ([b0399a4](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/b0399a4e489950083066c9538df9a84dcc7a4613))
|
||||||
|
* NCS-21 Write Scripts to automate certain tasks ([#15](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/15)) ([8051871](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/80518719d536a087d339fe02530825dc07f8b388))
|
||||||
|
* NCS-25 Add linters to keep quality up ([#27](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/27)) ([fd4e67d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/fd4e67d4f782a7e955822d90cb909d0a81676fb2))
|
||||||
|
* NCS-37 Quarkus integration ([#35](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/35)) ([f088c4e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/f088c4e9ffcc498d3d1b6f01e8f50042d5830d55))
|
||||||
|
* NCS-41 Bot Platform ([#33](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/33)) ([8744bee](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/8744bee2dd20966dae90a09c21a43d5b06f59e00))
|
||||||
|
* **rule:** Rules as a microservice ([#39](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/39)) ([093134d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/093134d36c6844ba02a36a28d5d044f09291cd1d))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **dependencies:** correct Jackson databind dependency group ID ([008d72d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/008d72d826707c04205bac7de25170fae5fed861))
|
||||||
|
* IO microservice ([#38](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/38)) ([a386f57](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a386f57c21d34ead6cc6f92836c52b714597e289))
|
||||||
|
## (2026-06-05)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **api:** define shared EventEnvelope and EventType for Redis EventBus ([#61](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/61)) ([595c172](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/595c172900da99de367c274488c3ccbeaef55882))
|
||||||
|
* **dto:** update GameWritebackEventDto for JSON deserialization and remove unused mixin ([576e3fe](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/576e3fea9bf1082549ea53efd3288474c42be93d))
|
||||||
|
* NCS-13 Implement Threefold Repetition ([#31](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/31)) ([767d305](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/767d3051a76c266050b6335774d66e2db2273c16))
|
||||||
|
* NCS-14 implemented insufficient moves rule ([#30](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/30)) ([b0399a4](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/b0399a4e489950083066c9538df9a84dcc7a4613))
|
||||||
|
* NCS-21 Write Scripts to automate certain tasks ([#15](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/15)) ([8051871](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/80518719d536a087d339fe02530825dc07f8b388))
|
||||||
|
* NCS-25 Add linters to keep quality up ([#27](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/27)) ([fd4e67d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/fd4e67d4f782a7e955822d90cb909d0a81676fb2))
|
||||||
|
* NCS-37 Quarkus integration ([#35](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/35)) ([f088c4e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/f088c4e9ffcc498d3d1b6f01e8f50042d5830d55))
|
||||||
|
* NCS-41 Bot Platform ([#33](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/33)) ([8744bee](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/8744bee2dd20966dae90a09c21a43d5b06f59e00))
|
||||||
|
* **rule:** Rules as a microservice ([#39](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/39)) ([093134d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/093134d36c6844ba02a36a28d5d044f09291cd1d))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **dependencies:** correct Jackson databind dependency group ID ([008d72d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/008d72d826707c04205bac7de25170fae5fed861))
|
||||||
|
* IO microservice ([#38](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/38)) ([a386f57](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a386f57c21d34ead6cc6f92836c52b714597e289))
|
||||||
|
## (2026-06-09)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **api:** define shared EventEnvelope and EventType for Redis EventBus ([#61](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/61)) ([595c172](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/595c172900da99de367c274488c3ccbeaef55882))
|
||||||
|
* **dto:** update GameWritebackEventDto for JSON deserialization and remove unused mixin ([576e3fe](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/576e3fea9bf1082549ea53efd3288474c42be93d))
|
||||||
|
* **events:** migrate game-creation and bot flows to Redis Streams NCS-89 ([#62](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/62)) ([a24924c](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a24924c23057db3d700a75dbc4333557789cd991))
|
||||||
|
* NCS-13 Implement Threefold Repetition ([#31](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/31)) ([767d305](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/767d3051a76c266050b6335774d66e2db2273c16))
|
||||||
|
* NCS-14 implemented insufficient moves rule ([#30](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/30)) ([b0399a4](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/b0399a4e489950083066c9538df9a84dcc7a4613))
|
||||||
|
* NCS-21 Write Scripts to automate certain tasks ([#15](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/15)) ([8051871](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/80518719d536a087d339fe02530825dc07f8b388))
|
||||||
|
* NCS-25 Add linters to keep quality up ([#27](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/27)) ([fd4e67d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/fd4e67d4f782a7e955822d90cb909d0a81676fb2))
|
||||||
|
* NCS-37 Quarkus integration ([#35](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/35)) ([f088c4e](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/f088c4e9ffcc498d3d1b6f01e8f50042d5830d55))
|
||||||
|
* NCS-41 Bot Platform ([#33](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/33)) ([8744bee](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/8744bee2dd20966dae90a09c21a43d5b06f59e00))
|
||||||
|
* **rule:** Rules as a microservice ([#39](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/39)) ([093134d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/093134d36c6844ba02a36a28d5d044f09291cd1d))
|
||||||
|
* true-microservices ([#40](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/40)) ([5909242](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/590924254e8a2754de661a57a03e43f89ceb6299))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **dependencies:** correct Jackson databind dependency group ID ([008d72d](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/008d72d826707c04205bac7de25170fae5fed861))
|
||||||
|
* IO microservice ([#38](https://git.janis-eccarius.de/NowChess/NowChessSystems/issues/38)) ([a386f57](https://git.janis-eccarius.de/NowChess/NowChessSystems/commit/a386f57c21d34ead6cc6f92836c52b714597e289))
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ dependencies {
|
|||||||
strictly(versions["SCALA_LIBRARY"]!!)
|
strictly(versions["SCALA_LIBRARY"]!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
implementation("com.fasterxml.jackson.core:jackson-databind:${versions["JACKSON"]!!}")
|
||||||
|
implementation("com.fasterxml.jackson.module:jackson-module-scala_3:${versions["JACKSON_SCALA"]!!}")
|
||||||
|
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${versions["JACKSON"]!!}")
|
||||||
|
|
||||||
testImplementation(platform("org.junit:junit-bom:5.13.4"))
|
testImplementation(platform("org.junit:junit-bom:5.13.4"))
|
||||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package de.nowchess.api.dto
|
||||||
|
|
||||||
|
import de.nowchess.api.game.GameMode
|
||||||
|
|
||||||
|
final case class GameCreationRequestDto(
|
||||||
|
white: Option[PlayerInfoDto],
|
||||||
|
black: Option[PlayerInfoDto],
|
||||||
|
timeControl: Option[TimeControlDto],
|
||||||
|
mode: Option[GameMode] = None,
|
||||||
|
)
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package de.nowchess.api.dto
|
||||||
|
|
||||||
|
final case class GameCreationResponseDto(
|
||||||
|
gameId: Option[String],
|
||||||
|
error: Option[String] = None,
|
||||||
|
)
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package de.nowchess.api.dto
|
package de.nowchess.api.dto
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
|
||||||
|
|
||||||
case class GameWritebackEventDto(
|
case class GameWritebackEventDto(
|
||||||
gameId: String,
|
gameId: String,
|
||||||
fen: String,
|
fen: String,
|
||||||
@@ -14,11 +16,11 @@ case class GameWritebackEventDto(
|
|||||||
limitSeconds: Option[Int],
|
limitSeconds: Option[Int],
|
||||||
incrementSeconds: Option[Int],
|
incrementSeconds: Option[Int],
|
||||||
daysPerMove: Option[Int],
|
daysPerMove: Option[Int],
|
||||||
whiteRemainingMs: Option[Long],
|
@JsonDeserialize(contentAs = classOf[java.lang.Long]) whiteRemainingMs: Option[Long],
|
||||||
blackRemainingMs: Option[Long],
|
@JsonDeserialize(contentAs = classOf[java.lang.Long]) blackRemainingMs: Option[Long],
|
||||||
incrementMs: Option[Long],
|
@JsonDeserialize(contentAs = classOf[java.lang.Long]) incrementMs: Option[Long],
|
||||||
clockLastTickAt: Option[Long],
|
@JsonDeserialize(contentAs = classOf[java.lang.Long]) clockLastTickAt: Option[Long],
|
||||||
clockMoveDeadline: Option[Long],
|
@JsonDeserialize(contentAs = classOf[java.lang.Long]) clockMoveDeadline: Option[Long],
|
||||||
clockActiveColor: Option[String],
|
clockActiveColor: Option[String],
|
||||||
pendingDrawOffer: Option[String],
|
pendingDrawOffer: Option[String],
|
||||||
result: Option[String] = None,
|
result: Option[String] = None,
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package de.nowchess.api.event
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode
|
||||||
|
import java.time.Instant
|
||||||
|
import java.util.UUID
|
||||||
|
|
||||||
|
final case class EventEnvelope(
|
||||||
|
eventId: UUID,
|
||||||
|
`type`: EventType,
|
||||||
|
payload: JsonNode,
|
||||||
|
timestamp: Instant,
|
||||||
|
correlationId: Option[String],
|
||||||
|
)
|
||||||
|
|
||||||
|
object EventEnvelope:
|
||||||
|
def of(
|
||||||
|
`type`: EventType,
|
||||||
|
payload: JsonNode,
|
||||||
|
correlationId: Option[String] = None,
|
||||||
|
): EventEnvelope =
|
||||||
|
EventEnvelope(
|
||||||
|
eventId = UUID.randomUUID(),
|
||||||
|
`type` = `type`,
|
||||||
|
payload = payload,
|
||||||
|
timestamp = Instant.now(),
|
||||||
|
correlationId = correlationId,
|
||||||
|
)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package de.nowchess.api.event
|
||||||
|
|
||||||
|
enum EventType:
|
||||||
|
case GameStart, GameCreationRequest, GameCreationResponse, BotGameStart, ChallengeCreated, ChallengeAccepted, GameOver
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user