Commit 413eacf
Subsystem 1b-i: credential intake & FCM pairing → server registration (#5)
* feat(persistence): split FCM registration from player credential pool
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(persistence): add FcmRegistrationStore
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(persistence): add resolve-or-create-by-endpoint to ServerService
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* test(persistence): cover pairing schema cascade and unique indexes
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore(pairing): scaffold Features.Pairing project and listener seam
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(pairing): add PairingHandler for server registration
Implements IPairingHandler / PairingHandler: resolves-or-creates the
server via IServerService, upserts the credential via ICredentialStore,
and publishes ServerRegisteredEvent only when the server is newly
created. Entity notifications are silently ignored.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(pairing): add owner DM notifier seam
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(pairing): add PairingSupervisor with expiry and backoff
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(pairing): add RustPlusApi.Fcm adapter for IPairingSource
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(pairing): add PairingHostedService
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(workspace): add Connect account button to #setup
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(pairing): add credential validator and connect modal
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(pairing): wire pairing feature into the host
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* style: apply ReSharper ReformatAndReorder
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix: address PR #5 review (race-safe active flag, upsert retry, non-throwing FCM Create)
- CredentialStore: derive Active from server-creation (race-free) instead of a TOCTOU read
- FcmRegistrationStore: recover from concurrent-insert unique violation by re-reading the winner
- RustPlusFcmPairingSource: Create no longer throws on bad credentials; maps to Rejected
- PairingHostedService: document the serial-Ready start-once rationale
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>1 parent ec10b64 commit 413eacf
57 files changed
Lines changed: 2672 additions & 47 deletions
File tree
- src
- RustPlusBot.Abstractions/Credentials
- RustPlusBot.Domain/Credentials
- RustPlusBot.Features.Pairing
- Hosting
- Listening
- Modules
- Notifications
- Pairing
- Supervisor
- Validation
- RustPlusBot.Features.Workspace
- Localization
- Messages
- RustPlusBot.Host
- RustPlusBot.Persistence
- Configurations
- Credentials
- Migrations
- Servers
- tests
- RustPlusBot.Features.Pairing.Tests
- Fakes
- RustPlusBot.Features.Workspace.Tests/Messages
- RustPlusBot.Persistence.Tests
- Credentials
- Servers
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| 13 | + | |
12 | 14 | | |
13 | 15 | | |
14 | 16 | | |
| |||
Lines changed: 14 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
7 | 13 | | |
| 14 | + | |
8 | 15 | | |
9 | | - | |
10 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
11 | 21 | | |
12 | 22 | | |
13 | 23 | | |
| |||
Lines changed: 4 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
| 6 | + | |
| 7 | + | |
8 | 8 | | |
9 | | - | |
10 | 9 | | |
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
15 | | - | |
16 | | - | |
| 14 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
Lines changed: 14 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | 27 | | |
31 | 28 | | |
32 | 29 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
Lines changed: 58 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
Lines changed: 27 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
0 commit comments