Files
slp-modular-cms/aidlc-docs/features/master-cms-module/construction/slave-availability-extension/functional-design/business-logic-model.md
T

5.1 KiB

Business Logic Model — Unit 2: slave-availability-extension

Flow 1: Register Master (POST /api/v1/master/register)

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)

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)

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)

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.