# Business Logic Model — Unit 2: slave-availability-extension ## Flow 1: Register Master (POST /api/v1/master/register) ```mermaid sequenceDiagram box rgba(33,150,243,0.15) Master CMS participant MC as MasterCms end box rgba(76,175,80,0.15) Slave CMS participant Ctrl as MasterController participant Svc as MasterAvailabilityService participant DB as AvailabilityDbContext end MC->>Ctrl: POST register with X-Master-Api-Key header and MasterUrl body Ctrl->>Svc: RegisterAsync(masterUrl, apiKey) Svc->>DB: GetRegistrationAsync() alt No registration exists DB-->>Svc: null Svc->>DB: Insert MasterRegistration with masterUrl apiKey RegisteredAt LastContactedAt=now DB-->>Svc: saved Svc-->>Ctrl: success Ctrl-->>MC: 200 OK else Registration exists and ApiKey matches DB-->>Svc: existing record Svc->>DB: Update MasterUrl and LastContactedAt=now DB-->>Svc: saved Svc-->>Ctrl: success Ctrl-->>MC: 200 OK else Registration exists and ApiKey does not match DB-->>Svc: existing record Svc-->>Ctrl: unauthorized Ctrl-->>MC: 401 Unauthorized end ``` Text alternative: Master posts to slave register endpoint. Service checks DB for existing registration. If none: insert new row. If exists and key matches: update MasterUrl. If exists but key mismatch: return 401. --- ## Flow 2: Status Push (POST /api/v1/master/status) ```mermaid sequenceDiagram box rgba(33,150,243,0.15) Master CMS participant MC as MasterCms end box rgba(76,175,80,0.15) Slave CMS participant Ctrl as MasterController participant Svc as MasterAvailabilityService participant DB as AvailabilityDbContext participant Cache as StaticCache end MC->>Ctrl: POST status with X-Master-Api-Key header isAvailable and disableMessage Ctrl->>Svc: PushStatusAsync(apiKey, isAvailable, disableMessage) Svc->>DB: GetRegistrationAsync() alt No registration DB-->>Svc: null Svc-->>Ctrl: unauthorized Ctrl-->>MC: 401 Unauthorized else ApiKey mismatch DB-->>Svc: record with different key Svc-->>Ctrl: unauthorized Ctrl-->>MC: 401 Unauthorized else ApiKey valid DB-->>Svc: valid registration Svc->>Cache: set _masterIsAvailable and _masterDisableMessage Svc->>DB: Update LastContactedAt=now DB-->>Svc: saved Svc-->>Ctrl: success Ctrl-->>MC: 200 OK end ``` Text alternative: Master posts status. Service validates API key. If valid: update static cache and LastContactedAt. On any validation failure: 401. --- ## Flow 3: Get Registered URL (GET /api/v1/master/registered-url) ```mermaid sequenceDiagram box rgba(33,150,243,0.15) Master CMS participant MC as MasterCms end box rgba(76,175,80,0.15) Slave CMS participant Ctrl as MasterController participant Svc as MasterAvailabilityService participant DB as AvailabilityDbContext end MC->>Ctrl: GET registered-url with X-Master-Api-Key header Ctrl->>Svc: GetRegisteredUrlAsync(apiKey) Svc->>DB: GetRegistrationAsync() alt No registration DB-->>Svc: null Svc-->>Ctrl: unauthorized Ctrl-->>MC: 401 Unauthorized else ApiKey mismatch DB-->>Svc: record Svc-->>Ctrl: unauthorized Ctrl-->>MC: 401 Unauthorized else ApiKey valid DB-->>Svc: valid registration Svc->>DB: Update LastContactedAt=now DB-->>Svc: saved Svc-->>Ctrl: return MasterUrl Ctrl-->>MC: 200 OK with MasterUrl payload end ``` Text alternative: Master requests the URL it registered on this slave. Service validates key, updates LastContactedAt, returns stored MasterUrl. 401 on any validation failure. --- ## Flow 4: Middleware Gate Evaluation (every request) ```mermaid sequenceDiagram box rgba(33,150,243,0.15) Incoming Request participant Req as HttpRequest end box rgba(76,175,80,0.15) Slave CMS Pipeline participant MW as AvailabilityMiddleware participant Cache as StaticCache participant Local as IAvailabilityService participant Next as NextMiddleware end Req->>MW: any request alt Path in bypass list MW-->>Next: pass through unconditionally else Admin JWT bearer token present MW-->>Next: pass through unconditionally else Check master gate MW->>Cache: read _masterIsAvailable alt Master is available or no status received yet MW->>Local: IsAvailableAsync() alt Locally available MW-->>Next: pass through else Locally unavailable MW-->>Req: 503 with local disable message end else Master says unavailable MW-->>Req: 503 with master disable message end end ``` Text alternative: Middleware first checks bypass paths, then admin JWT. If neither applies: checks static master cache; if master unavailable return 503. If master available: checks local availability service; if locally unavailable return 503. Otherwise pass through.