Public/Send-BridgePushover.ps1

function Send-BridgePushover {
    <#
    .SYNOPSIS
    Αποστέλλει ειδοποίηση μέσω Pushover για κατάσταση γέφυρας.
 
    .DESCRIPTION
    Η Send-BridgePushover δημιουργεί payload και αποστέλλει ειδοποίηση
    στο σύστημα Pushover, χρησιμοποιώντας παρεχόμενα διαπιστευτήρια.
 
    .PARAMETER PoUserKey
    Το User Key του παραλήπτη στο Pushover.
 
    .PARAMETER PoApiKey
    Το API Token της εφαρμογής.
 
    .PARAMETER Message
    Το μήνυμα της ειδοποίησης.
 
    .PARAMETER Device
    Η συσκευή στόχος (προαιρετικό).
 
    .PARAMETER Title
    Ο τίτλος της ειδοποίησης (προαιρετικό).
 
    .PARAMETER Url
    URL που θα επισυνάπτεται στην ειδοποίηση (προαιρετικό).
 
    .PARAMETER UrlTitle
    Ο τίτλος για το επισυναπτόμενο URL (προαιρετικό).
 
    .PARAMETER Priority
    Η προτεραιότητα ειδοποίησης (προαιρετικό).
 
    .PARAMETER Sound
    Ο ήχος ειδοποίησης (προαιρετικό).
 
    .OUTPUTS
    None.
 
    .EXAMPLE
    Send-BridgePushover -PoUserKey 'user123' -PoApiKey 'token123' -Message 'Η γέφυρα είναι ανοιχτή.'
 
    .NOTES
    Χρησιμοποιεί εσωτερικές helper συναρτήσεις για payload και αποστολή.
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', 'PoUserKey',
        Justification = 'Το κλειδί API διαβάζεται από τα Docker secrets κατά το runtime, όχι από είσοδο χρήστη. Η μετατροπή σε SecureString δεν προσφέρει κανένα όφελος σε αυτό το μη διαδραστικό pipeline.')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', 'PoApiKey',
        Justification = 'Το κλειδί API διαβάζεται από τα Docker secrets κατά το runtime, όχι από είσοδο χρήστη. Η μετατροπή σε SecureString δεν προσφέρει κανένα όφελος σε αυτό το μη διαδραστικό pipeline.')]
    [CmdletBinding()]
    [OutputType([void])]
    param (
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$PoUserKey,
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$PoApiKey,
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$Message,
        [ValidateNotNullOrEmpty()][string]$Device,
        [ValidateNotNullOrEmpty()][string]$Title,
        [ValidateScript({ $_ -match '^https?://' })]
        [string]$Url,
        [ValidateNotNullOrEmpty()][string]$UrlTitle,
        [ValidateRange(0, 2)][int]$Priority,
        [ValidateSet('pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', 'persistent', 'echo', 'updown', 'none')]
        [string]$Sound
    )

    try {
        $payload = @{
            token   = $PoApiKey
            user    = $PoUserKey
            message = $Message
        }
        if ($PSBoundParameters.ContainsKey('Device') -and $Device) { $payload.device = $Device }
        if ($PSBoundParameters.ContainsKey('Title') -and $Title) { $payload.title = $Title }
        if ($PSBoundParameters.ContainsKey('Url') -and $Url) { $payload.url = $Url }
        if ($PSBoundParameters.ContainsKey('UrlTitle') -and $UrlTitle) { $payload.url_title = $UrlTitle }
        if ($PSBoundParameters.ContainsKey('Priority')) { $payload.priority = $Priority }
        if ($PSBoundParameters.ContainsKey('Sound') -and $Sound) { $payload.sound = $Sound }

        $sendPushoverRequestSplat = @{
            Payload     = $payload
            ErrorAction = 'Stop'
        }
        [void](Send-BridgePushoverRequest @sendPushoverRequestSplat)
    } catch {
        $writeBridgeLogSplat = @{
            Stage   = 'Σφάλμα'
            Message = "❌ Αποτυχία αποστολής Pushover: $($_.Exception.Message)"
            Level   = 'Warning'
        }
        Write-BridgeLog @writeBridgeLogSplat

        $PSCmdlet.ThrowTerminatingError(
             [System.Management.Automation.ErrorRecord]::new(
                 ([System.Exception]::new("Αποτυχία αποστολής Pushover: $($_.Exception.Message)", $_.Exception)),
                 'PushoverSendError',
                 [System.Management.Automation.ErrorCategory]::ConnectionError,
                 $Message
             )
         )
    }
}