Compare commits

..

2 Commits

Author SHA1 Message Date
6768946b0a test: improve test coverage
Some checks failed
Publish Docker Images / build-and-publish (push) Has been cancelled
2025-11-15 23:18:16 +01:00
1e769f0b39 feat: send confirmation email to sender
When users submit a contact form, they now receive a confirmation
email acknowlledging receipt of their message. The backend also
continues to send a notification email to the configured recipient.

If the backend fails to send the acknowledgement email to the sender,
it will assume the email is not valid and will therefore not transmit
the contact request to the configured recipient.

Changes:
- Refactor `send_email()` to `send_emails()` that sends two emails:
  - Confirmation email from the submitter
  - Notification email to the configured recipient
- Add `From<T>` implementations of various errors for new error type
  `ContactError`.
- Errors now return a translation identifier for the frontend.
2025-11-15 23:03:26 +01:00
4 changed files with 43 additions and 39 deletions

View File

@@ -7,7 +7,7 @@ The `publish-docker.yml` workflow automatically builds and publishes Docker imag
### Triggers and Tagging Strategy
| Event | Condition | Published Tags | Example |
|--------------|-----------------------------|------------------------|-------------------|
|--------------+-----------------------------+------------------------+-------------------|
| Tag push | Tag pushed to `main` branch | `latest` + version tag | `latest`, `1.0.0` |
| Branch push | Push to `develop` branch | `develop` | `develop` |
| Pull request | PR opened or updated | `pr<number>` | `pr12` |
@@ -18,7 +18,7 @@ The `publish-docker.yml` workflow automatically builds and publishes Docker imag
Configure these secrets in your repository settings (`Settings``Secrets and variables``Actions`):
| Secret Name | Description | Example Value |
|---------------------|---------------------------------------------|-----------------------------------------|
|---------------------+---------------------------------------------+-----------------------------------------|
| `DOCKER_USERNAME` | Username for Docker registry authentication | `phundrak` |
| `DOCKER_PASSWORD` | Password or token for Docker registry | Personal Access Token (PAT) or password |
| `CACHIX_AUTH_TOKEN` | (Optional) Token for Cachix caching | Your Cachix auth token |

View File

@@ -12,6 +12,7 @@ on:
env:
CACHIX_NAME: devenv
CACHIX_SKIP_PUSH: true
DOCKER_REGISTRY: labs.phundrak.com # Override in repository settings if needed
IMAGE_NAME: phundrak/phundrak-dot-com-backend
@@ -37,17 +38,7 @@ jobs:
with:
name: '${{ env.CACHIX_NAME }}'
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
skipPush: ${{ github.event_name == 'pull_request' }}
- name: Coverage
run: |
nix develop --no-pure-eval --command just coverage
- name: Sonar analysis
uses: SonarSource/sonarqube-scan-action@v6
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
skipPush: ${{ env.CACHIX_SKIP_PUSH }}
- name: Build Docker image with Nix
run: |

View File

@@ -1,24 +1,42 @@
---
include_toc: true
gitea: none
---
# phundrak.com Backend
<div align="center">
<a href="https://sonar.phundrak.com/dashboard?id=phundrak-backend" target="_blank">
<img src="https://sonar.phundrak.com/api/project_badges/measure?project=phundrak-backend&metric=coverage&token=sqb_bda24bf36825576d6c6b76048044e103339c3c5f" alt="Sonar Coverage" />
</a>
<a href="https://sonar.phundrak.com/dashboard?id=phundrak-backend" target="_blank">
<img src="https://sonar.phundrak.com/api/project_badges/measure?project=phundrak-backend&metric=alert_status&token=sqb_bda24bf36825576d6c6b76048044e103339c3c5f" alt="Sonar Quality Gate Status" />
</a>
<a href="#license">
<img src="https://img.shields.io/badge/License-AGPL--3.0--only-blue" alt="License" />
</a>
<a href="https://www.gnu.org/software/emacs/" target="_blank">
<img src="https://img.shields.io/badge/Made%20with-GNU%2FEmacs-blueviolet.svg?logo=GNU%20Emacs&logoColor=white" alt="Made with GNU/Emacs" />
</a>
</div>
<!--toc:start-->
- [phundrak.com Backend](#phundrakcom-backend)
- [Features](#features)
- [API Endpoints](#api-endpoints)
- [Configuration](#configuration)
- [Configuration Example](#configuration-example)
- [Rate Limiting](#rate-limiting)
- [Development](#development)
- [Prerequisites](#prerequisites)
- [Running the Server](#running-the-server)
- [Building](#building)
- [Testing](#testing)
- [Testing Notes](#testing-notes)
- [Code Quality](#code-quality)
- [Linting](#linting)
- [Continuous Checking with Bacon](#continuous-checking-with-bacon)
- [Code Style](#code-style)
- [Error Handling](#error-handling)
- [Logging](#logging)
- [Imports](#imports)
- [Testing Conventions](#testing-conventions)
- [Project Structure](#project-structure)
- [Architecture](#architecture)
- [Application Initialization Flow](#application-initialization-flow)
- [Email Handling](#email-handling)
- [Docker Deployment](#docker-deployment)
- [Using Pre-built Images](#using-pre-built-images)
- [Available Image Tags](#available-image-tags)
- [Building Images Locally](#building-images-locally)
- [Docker Compose Example](#docker-compose-example)
- [CI/CD Pipeline](#cicd-pipeline)
- [Automated Docker Publishing](#automated-docker-publishing)
- [Workflow Details](#workflow-details)
- [Registry Configuration](#registry-configuration)
- [Required Secrets](#required-secrets)
- [License](#license)
<!--toc:end-->
The backend for [phundrak.com](https://phundrak.com), built with Rust and the [Poem](https://github.com/poem-web/poem) web framework.
@@ -198,7 +216,6 @@ just coverage
- Tests use `get_test_app()` helper for consistent test setup
- Telemetry is automatically disabled during tests
- Tests are organized in `#[cfg(test)]` modules within each file
- Email sending is tested using lettre's `StubTransport` for mocking SMTP operations
## Code Quality
@@ -277,15 +294,12 @@ backend/
│ ├── startup.rs # Application builder, server setup
│ ├── settings.rs # Configuration management
│ ├── telemetry.rs # Logging and tracing setup
│ ├── errors.rs # Error type re-exports
│ ├── middleware/ # Custom middleware
│ │ ├── mod.rs # Middleware module
│ │ └── rate_limit.rs # Rate limiting middleware
│ └── route/ # API route handlers
│ ├── mod.rs # Route organization
│ ├── contact/ # Contact form module
│ │ ├── mod.rs # Contact form endpoint
│ │ └── errors.rs # Contact form error types
│ ├── contact.rs # Contact form endpoint
│ ├── health.rs # Health check endpoint
│ └── meta.rs # Metadata endpoint
├── settings/ # Configuration files
@@ -445,4 +459,4 @@ See [.github/workflows/README.md](./.github/workflows/README.md) for detailed se
## License
AGPL-3.0-only - See [LICENSE.md](./LICENSE.md) for full license information.
AGPL-3.0-only - See the root repository for full license information.

View File

@@ -1 +0,0 @@
sonar.projectKey=phundrak-backend