Add Posta hosting integration - #1461
Conversation
- Introduced `CommunityToolkit.Aspire.Hosting.Posta` project for integrating Posta with PostgreSQL and Redis. - Added extension methods for configuring Posta containers, health checks, and resource dependencies. - Created test projects for validating Posta container configuration and health checks. - Added example projects under `examples/posta` showcasing Posta integration with PostgreSQL and Redis. - Updated solution file and package references to include the new Posta project.
- Introduced `CommunityToolkit.Aspire.Hosting.Posta` project for integrating Posta as a containerized resource. - Added extension methods for configuring Posta containers, including support for PostgreSQL, Redis, and advanced environment options. - Defined Posta resource options, container image tags, and health check configurations.
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.sh | bash -s -- 1461Or
iex "& { $(irm https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.ps1) } 1461" |
…ources to `AddPosta`. Refine README to reflect updated API and usage.
…nces - Introduced tests to validate `AddPosta` behavior with null database and Redis inputs, ensuring proper exception handling. - Added test to confirm PostgreSQL and Redis configuration via environment variables.
…dPosta` methods. Extend methods to support chained references.
… with improved configuration options.
… Remove redundant overloads in `PostaHostingExtensions`.
…d `RedisAddress`; refine README to clarify environment configuration usage.
…g additional expression types
…ble assignments with `Set` and `SetIfNotNull` methods for improved readability and consistency.
…r Redis authentication support.
…tion values, ensuring flexibility and enhanced security.
… and improve environment variable assertions.
…ve method null-checks and chaining logic.
…up by replacing `SetIfNotNull` with `SetParameter`, adding default values, and introducing `SetIfAbsent` to prevent overwrites.
… resource builders for improved flexibility and configurability.
- Introduced `PostaEmailVerificationOptions`, `PostaGoogleOAuthOptions`, `PostaInboundSmtpOptions`, `PostaS3BlobStorageOptions`, and `PostaSystemSmtpOptions` for parameterized configuration. - Added `PostaEnvironmentVariables` to define constants for environment variable keys. - Created `launchSettings.json` example for local hosting configuration.
…tion, enhance environment variable assertions, and streamline option setup.
…, improve secret handling, and streamline examples.
…constants, improve environment variable handling, and modularize configuration setup.
…types, add defaults, and improve XML summaries for configuration properties.
…3 storage, and email verification
…th, S3 storage, and email verification
- Introduced core model definitions for Posta API, including support for templates, emails, and applications. - Added project structure, including example, source, and test projects. - Configured dependency requirements, project references, and test configurations.
…ce and Posta test projects
…ents - Introduced `WithDataVolume` and `WithDataBindMount` extension methods to configure filesystem-backed attachment storage. - Updated `README.md` with examples and details for volume/bind mount usage. - Added unit tests to validate volume and bind mount behavior.
…and environment variables
…ion and environment variables
- Introduced `WithSmtpRelay` methods for parameterized SMTP relay setup. - Added `SmtpRelayEnabled`, `SmtpRelayHost`, `SmtpRelayPort`, and related options to `PostaOptions`. - Updated environment variables and resource builders to support SMTP relay. - Enhanced `README.md` with examples for using the new SMTP relay functionality. - Added unit tests to validate SMTP relay configuration and endpoint exposure.
There was a problem hiding this comment.
Pull request overview
Adds a new Posta integration to the Aspire Community Toolkit, spanning both an AppHost hosting resource (CommunityToolkit.Aspire.Hosting.Posta) and a discoverable HTTP client integration (CommunityToolkit.Aspire.Posta) with examples and tests.
Changes:
- Introduces a Posta container-backed hosting resource with PostgreSQL/Redis reference wiring, environment/options configuration, and health checks.
- Adds a Posta HTTP API client with endpoint catalog, typed request/response models, and transport layer.
- Adds a runnable example AppHost and accompanying unit + Docker smoke tests, and updates the repo integration list.
Show a summary per file
| File | Description |
|---|---|
| README.md | Adds Posta integration entry + link refs. |
| CommunityToolkit.Aspire.slnx | Adds Posta projects to the solution. |
| src/CommunityToolkit.Aspire.Hosting.Posta/CommunityToolkit.Aspire.Hosting.Posta.csproj | Hosting integration package project. |
| src/CommunityToolkit.Aspire.Hosting.Posta/README.md | Hosting integration documentation. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaContainerImageTags.cs | Defines pinned Posta container image/tag. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaEmailVerificationOptions.cs | Parameter-based email verification options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaEnvironmentVariables.cs | Posta env-var constants. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaGoogleOAuthOptions.cs | Parameter-based Google OAuth options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaHostingExtensions.cs | AddPosta / WithReference / config extension methods. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaInboundSmtpOptions.cs | Parameter-based inbound SMTP options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaOptions.cs | Typed Posta container configuration options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaResource.cs | Posta resource model + connection properties. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaS3BlobStorageOptions.cs | Parameter-based S3 blob storage options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaSmtpRelayOptions.cs | Parameter-based SMTP relay options. |
| src/CommunityToolkit.Aspire.Hosting.Posta/PostaSystemSmtpOptions.cs | Parameter-based system SMTP options. |
| src/CommunityToolkit.Aspire.Posta/CommunityToolkit.Aspire.Posta.csproj | Client integration package project. |
| src/CommunityToolkit.Aspire.Posta/README.md | Client integration documentation. |
| src/CommunityToolkit.Aspire.Posta/Clients/IPostaClient.cs | Client root interface. |
| src/CommunityToolkit.Aspire.Posta/Clients/IPostaSectionClient.cs | Common section-client operations interface. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaClient.cs | Default client implementation. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaClientBuilderExtensions.cs | AddPostaClient DI registration extensions. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaClientSection.cs | Section client implementation wrapper. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaOperations.cs | Typed operations interfaces + implementations. |
| src/CommunityToolkit.Aspire.Posta/Clients/PostaSectionClient.cs | Base class for section clients. |
| src/CommunityToolkit.Aspire.Posta/Configuration/IPostaCredentialProvider.cs | Credential provider interface. |
| src/CommunityToolkit.Aspire.Posta/Configuration/PostaClientSettings.cs | Client settings model. |
| src/CommunityToolkit.Aspire.Posta/Configuration/PostaCredentialProvider.cs | Default credential provider. |
| src/CommunityToolkit.Aspire.Posta/Endpoints/IPostaEndpoints.cs | Endpoint catalog interface. |
| src/CommunityToolkit.Aspire.Posta/Endpoints/PostaEndpoint.cs | Endpoint + auth-mode types. |
| src/CommunityToolkit.Aspire.Posta/Endpoints/PostaEndpoints.cs | Default endpoint catalog implementation. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/GetEmailDeliveryStatusRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/GetEmailDeliveryStatusResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/GetEmailDetailsRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/GetEmailDetailsResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/PreviewEmailFromTemplateRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/PreviewEmailFromTemplateResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/RetryFailedEmailRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/RetryFailedEmailResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendAnEmailRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendAnEmailResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendBatchEmailsRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendBatchEmailsResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendEmailUsingTemplateRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/SendEmailUsingTemplateResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/VerifyAnEmailAddressRequest.cs | Email API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Emails/VerifyAnEmailAddressResponse.cs | Email API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Health/LivenessProbeResponse.cs | Health API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Health/ReadinessProbeResponse.cs | Health API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Info/ApplicationInfoResponse.cs | Info API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/ReSubscribeAnEmailToAListRequest.cs | Subscriber list API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/ReSubscribeAnEmailToAListResponse.cs | Subscriber list API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/SubscribeAnEmailToAListRequest.cs | Subscriber list API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/SubscribeAnEmailToAListResponse.cs | Subscriber list API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/UnsubscribeAnEmailFromAListRequest.cs | Subscriber list API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/SubscriberLists/UnsubscribeAnEmailFromAListResponse.cs | Subscriber list API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/CreateTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/CreateTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/DeleteTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/DeleteTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/GetTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/GetTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/ListTemplatesRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/ListTemplatesResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/PreviewTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/PreviewTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/SendTestEmailRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/SendTestEmailResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/UpdateTemplateRequest.cs | Template API request model. |
| src/CommunityToolkit.Aspire.Posta/Models/Templates/UpdateTemplateResponse.cs | Template API response model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ApplicationInfoResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataActiveVersion.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataActiveVersionLocalizationsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataActiveVersionStylesheet.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataCreatedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/CreateTemplateResponseDataLastEditedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetEmailDeliveryStatusResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetEmailDetailsResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataActiveVersion.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataActiveVersionLocalizationsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataActiveVersionStylesheet.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataCreatedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/GetTemplateResponseDataLastEditedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemActiveVersion.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemActiveVersionLocalizationsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemActiveVersionStylesheet.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemCreatedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponseDataItemLastEditedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ListTemplatesResponsePageable.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/PreviewEmailFromTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/PreviewTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/ReSubscribeAnEmailToAListResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/RetryFailedEmailResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendAnEmailRequestAttachmentsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendAnEmailRequestUnsubscribe.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendAnEmailResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendBatchEmailsRequestRecipientsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendBatchEmailsRequestUnsubscribe.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendBatchEmailsResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendBatchEmailsResponseDataResultsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendEmailUsingTemplateRequestAttachmentsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendEmailUsingTemplateRequestUnsubscribe.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendEmailUsingTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SendTestEmailResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/SubscribeAnEmailToAListResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UnsubscribeAnEmailFromAListResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataActiveVersion.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataActiveVersionLocalizationsItem.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataActiveVersionStylesheet.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataCreatedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/UpdateTemplateResponseDataLastEditedBy.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/VerifyAnEmailAddressResponseData.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Models/Shared/VerifyAnEmailAddressResponseDataChecks.cs | Shared schema model. |
| src/CommunityToolkit.Aspire.Posta/Transport/PostaApiException.cs | Transport exception type. |
| src/CommunityToolkit.Aspire.Posta/Transport/PostaRequest.cs | Transport request envelope. |
| src/CommunityToolkit.Aspire.Posta/Transport/PostaStreamResponse.cs | Transport streaming response wrapper. |
| src/CommunityToolkit.Aspire.Posta/Transport/PostaTransport.cs | Transport implementation (HTTP + auth + serialization). |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.AppHost/CommunityToolkit.Aspire.Hosting.Posta.AppHost.csproj | Example AppHost project. |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.AppHost/Program.cs | Example AppHost wiring Posta/Postgres/Redis. |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.AppHost/Properties/launchSettings.json | Example AppHost launch profiles. |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.ApiService/CommunityToolkit.Aspire.Hosting.Posta.ApiService.csproj | Example API service project. |
| examples/posta/CommunityToolkit.Aspire.Hosting.Posta.ApiService/Program.cs | Example usage of the Posta client. |
| tests/CommunityToolkit.Aspire.Hosting.Posta.Tests/AppHostTests.cs | Docker smoke test for Posta resource. |
| tests/CommunityToolkit.Aspire.Hosting.Posta.Tests/CommunityToolkit.Aspire.Hosting.Posta.Tests.csproj | Hosting tests project. |
| tests/CommunityToolkit.Aspire.Hosting.Posta.Tests/ContainerResourceCreationTests.cs | Hosting resource/unit tests for env/endpoints/refs. |
| tests/CommunityToolkit.Aspire.Posta.Tests/CommunityToolkit.Aspire.Posta.Tests.csproj | Client tests project. |
| tests/CommunityToolkit.Aspire.Posta.Tests/PostaClientTests.cs | Client unit tests for transport/endpoints behavior. |
Review details
- Files reviewed: 130/130 changed files
- Comments generated: 5
- Review effort level: Lite
| private static string ExpandPath(string template, IReadOnlyDictionary<string, object?> values) | ||
| { | ||
| string result = template; | ||
| foreach ((string name, object? value) in values) | ||
| { | ||
| result = result.Replace("{" + name + "}", Uri.EscapeDataString(ConvertToString(value)), StringComparison.Ordinal); | ||
| } |
|
|
||
| /// <remarks>0.13.1</remarks> | ||
| public const string Tag = "0.13.1"; |
| @@ -0,0 +1,29 @@ | |||
| var builder = DistributedApplication.CreateBuilder(args); | |||
|
|
|||
| var postgresPassword = builder.AddParameter("postgres-password", "posta"); | |||
| | - **Learn More**: [`Hosting.Bitwarden.SecretManager`][bitwarden-secret-manager-integration-docs] <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager][bitwarden-secret-manager-hosting-shields]][bitwarden-secret-manager-hosting-nuget] <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager][bitwarden-secret-manager-hosting-shields-preview]][bitwarden-secret-manager-hosting-nuget-preview] | A hosting integration for Bitwarden Secrets Manager projects and managed secrets. | | ||
| | - **Learn More**: [`Bitwarden.SecretManager`][bitwarden-secret-manager-integration-docs] <br /> - Stable 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager][bitwarden-secret-manager-client-shields]][bitwarden-secret-manager-client-nuget] <br /> - Preview 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager][bitwarden-secret-manager-client-shields-preview]][bitwarden-secret-manager-client-nuget-preview] | A client integration for authenticating and using the Bitwarden Secrets Manager SDK from Aspire applications. | | ||
| | - **Learn More**: [`Hosting.Perl`][perl-integration-docs] <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Perl][perl-shields]][perl-nuget] <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Perl][perl-shields-preview]][perl-nuget-preview] | A hosting integration for Perl scripts and APIs. | | ||
| | - **Learn More**: [`Hosting.Posta`][posta-integration-docs] <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Posta][posta-shields]][posta-nuget] <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Posta][posta-shields-preview]][posta-nuget-preview] | An Aspire hosting integration for the [Posta](https://docs.goposta.dev/) self-hosted email delivery platform. | |
| [posta-integration-docs]: ./src/CommunityToolkit.Aspire.Hosting.Posta/README.md | ||
| [posta-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Posta | ||
| [posta-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Posta/ | ||
| [posta-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Posta?label=nuget%20(preview) | ||
| [posta-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Posta/absoluteLatest |
aaronpowell
left a comment
There was a problem hiding this comment.
Some small nits and a merge conflict
| internal PostaClient(PostaTransport transport, IPostaEndpoints endpoints) | ||
| { | ||
| _section = new PostaClientSection(transport, endpoints); | ||
| Endpoints = endpoints; | ||
| } |
There was a problem hiding this comment.
Just so we're consistent everywhere, let's use a primary constructor
| builder.Services.AddKeyedSingleton<IPostaClient>(serviceKey, (services, _) => | ||
| { | ||
| IPostaCredentialProvider credentialProvider = services.GetService<IPostaCredentialProvider>() ?? new PostaCredentialProvider(settings); | ||
| HttpClient httpClient = services.GetRequiredService<IHttpClientFactory>().CreateClient($"Posta:{connectionName}"); | ||
| return new PostaClient(new PostaTransport(httpClient, credentialProvider), services.GetRequiredService<IPostaEndpoints>()); | ||
| }); | ||
| if (registerDefault) | ||
| { | ||
| builder.Services.TryAddSingleton(services => services.GetRequiredKeyedService<IPostaClient>(serviceKey)); | ||
| } |
There was a problem hiding this comment.
This isn't really consistent with how we design elsewhere, we shouldn't be adding a keyed service if they haven't asked for one.
Have a look at how the AddKurrentDBClient handles keyed vs non-keyed service registration
| return; | ||
| } | ||
|
|
||
| foreach (string part in connectionString.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) |
There was a problem hiding this comment.
Better using DbConnectionStringBuilder to parse the connection string, saves writing your own parser here
| : base(transport) | ||
| { | ||
| _endpoints = endpoints; | ||
| } |
| internal PostaSectionClient(PostaTransport transport) | ||
| { | ||
| _transport = transport; | ||
| } |
There was a problem hiding this comment.
Use a primary constructor without the field
| internal PostaApiException(HttpStatusCode statusCode, string? responseBody, string message) | ||
| : base(message, null, statusCode) | ||
| { | ||
| ResponseBody = responseBody; | ||
| } | ||
|
|
| private readonly HttpResponseMessage _response; | ||
|
|
||
| internal PostaStreamResponse(HttpResponseMessage response, Stream stream) | ||
| { | ||
| _response = response; | ||
| Stream = stream; | ||
| } |
There was a problem hiding this comment.
Use a primary constructor without the field
Adds a new
CommunityToolkit.Aspire.Hosting.Postahosting integration for Posta, a self-hosted email delivery platform.
This PR adds:
PostaResourcewith connection properties for the Posta HTTP API/dashboardAddPosta(...)for adding the Posta container resourceWithReference(...)support for connecting Posta to PostgreSQL and Redis resourcesPostaOptionsfor configuring Posta environment variables, including web URLs, rate limits, OAuth, blob storage,SMTP, inbound email, email verification, metrics, and advanced switches
keys, encryption key, inbound webhook secret, PostgreSQL URL, and Redis password
/healthzand/readyzexamples/postaThe container image is pinned to
jkaninda/posta:0.11.0.PR Checklist
don't push entire description over that)
Other information
Validated locally with:
dotnet build tests/CommunityToolkit.Aspire.Hosting.Posta.Tests/CommunityToolkit.Aspire.Hosting.Posta.Tests.csproj --no-restore dotnet test tests/CommunityToolkit.Aspire.Hosting.Posta.Tests/CommunityToolkit.Aspire.Hosting.Posta.Tests.csproj --no- build Test result: 9 passed, 0 failed.