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() }