|
- param(
- [Parameter(Mandatory = $true)][string]$RequestPath,
- [string]$ConfigPath = (Join-Path (Split-Path -Parent $PSScriptRoot) 'config.ini')
- )
- $ErrorActionPreference = 'Stop'
- . (Join-Path $PSScriptRoot 'campaign-common.ps1')
- $context = Get-MailContext -ConfigPath $ConfigPath
- $request = Read-CampaignRequest $RequestPath
- if (-not $request.TestReceived) { throw 'Confirm that the campaign test was received before approval' }
- $db = Open-MailDatabase $context
- $transaction = $null
- try {
- $transaction = $db.BeginTransaction()
- $review = Get-CampaignReview $context $request $db $transaction
- Assert-ReviewToken $request $review
- $check = New-DbCommand $db "SELECT COUNT(*) FROM [AuditEvent] WHERE [Action]='campaign_test_accepted' AND [EntityId]=?" $transaction
- Add-TextParameter $check 'token' 100 $review.Token
- if ([int]$check.ExecuteScalar() -lt 1) { throw 'Send the reviewed campaign to the internal test inbox first' }
- $check = New-DbCommand $db "SELECT COUNT(*) FROM [AuditEvent] WHERE [Action]='campaign_approved' AND [EntityId]=?" $transaction
- Add-TextParameter $check 'token' 100 $review.Token
- if ([int]$check.ExecuteScalar() -gt 0) { throw 'This exact campaign review was already approved' }
-
- $command = New-DbCommand $db 'INSERT INTO [Campaign] ([Name],[SenderKey],[FromSnapshot],[ReplyToSnapshot],[PostalAddressSnapshot],[Subject],[TemplateVersionId],[Status],[StartAtUtc],[ApprovedAtUtc]) VALUES (?,?,?,?,?,?,?,?,?,?)' $transaction
- Add-TextParameter $command 'name' 200 $review.Name
- Add-TextParameter $command 'sender' 254 $context.Settings['SMTP_USER'].ToLowerInvariant()
- Add-TextParameter $command 'from' 254 $review.Identity.From
- Add-TextParameter $command 'reply' 254 $review.Identity.ReplyTo
- $null = $command.Parameters.Add('postal', [System.Data.OleDb.OleDbType]::LongVarWChar)
- $command.Parameters[4].Value = $review.Identity.Postal
- Add-TextParameter $command 'subject' 255 $review.Subject
- $null = $command.Parameters.Add('template', [System.Data.OleDb.OleDbType]::Integer)
- $command.Parameters[6].Value = $review.TemplateId
- Add-TextParameter $command 'status' 30 'approved_paused'
- $null = $command.Parameters.Add('start', [System.Data.OleDb.OleDbType]::Date)
- $command.Parameters[8].Value = [DateTime]::UtcNow
- $null = $command.Parameters.Add('approved', [System.Data.OleDb.OleDbType]::Date)
- $command.Parameters[9].Value = [DateTime]::UtcNow
- $null = $command.ExecuteNonQuery()
- $identity = New-DbCommand $db 'SELECT @@IDENTITY' $transaction
- $campaignId = [int]$identity.ExecuteScalar()
- foreach ($contact in $review.Contacts) {
- $delivery = New-DbCommand $db 'INSERT INTO [Delivery] ([CampaignId],[ContactId],[EmailKey],[Status],[AttemptCount]) VALUES (?,?,?,?,?)' $transaction
- $null = $delivery.Parameters.Add('campaign', [System.Data.OleDb.OleDbType]::Integer)
- $delivery.Parameters[0].Value = $campaignId
- $null = $delivery.Parameters.Add('contact', [System.Data.OleDb.OleDbType]::Integer)
- $delivery.Parameters[1].Value = $contact.Id
- Add-TextParameter $delivery 'email' 254 $contact.Key
- Add-TextParameter $delivery 'status' 30 'pending'
- $null = $delivery.Parameters.Add('attempts', [System.Data.OleDb.OleDbType]::Integer)
- $delivery.Parameters[4].Value = 0
- $null = $delivery.ExecuteNonQuery()
- }
- Write-CampaignAudit $db 'campaign_approved' $review.Token ("Campaign $campaignId, $($review.Contacts.Count) recipients") $transaction
- $transaction.Commit()
- $transaction = $null
- Write-Output "Approved campaign $campaignId with $($review.Contacts.Count) queued recipients. It remains paused."
- }
- catch {
- if ($transaction) { $transaction.Rollback() }
- throw
- }
- finally { $db.Dispose() }
|