Compare commits

..

3 Commits

Author SHA1 Message Date
9dfd012dea docs(README): open links in new tabs
All checks were successful
Publish Docker Images / build-and-publish (push) Successful in 13m44s
2025-11-17 10:16:28 +01:00
399f30157f chore: add Sonar analysis
All checks were successful
Publish Docker Images / build-and-publish (push) Successful in 12m32s
2025-11-16 02:02:58 +01:00
0b60e67e19 feat: send confirmation email to sender
All checks were successful
Publish Docker Images / build-and-publish (push) Successful in 8m13s
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:43:44 +01:00
4 changed files with 39 additions and 43 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,7 +12,6 @@ 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
@@ -38,7 +37,17 @@ jobs:
with:
name: '${{ env.CACHIX_NAME }}'
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
skipPush: ${{ env.CACHIX_SKIP_PUSH }}
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 }}
- name: Build Docker image with Nix
run: |

View File

@@ -1,42 +1,24 @@
---
include_toc: true
gitea: none
---
# phundrak.com Backend
<!--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-->
<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>
The backend for [phundrak.com](https://phundrak.com), built with Rust and the [Poem](https://github.com/poem-web/poem) web framework.
@@ -216,6 +198,7 @@ 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
@@ -294,12 +277,15 @@ 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.rs # Contact form endpoint
│ ├── contact/ # Contact form module
│ │ ├── mod.rs # Contact form endpoint
│ │ └── errors.rs # Contact form error types
│ ├── health.rs # Health check endpoint
│ └── meta.rs # Metadata endpoint
├── settings/ # Configuration files
@@ -459,4 +445,4 @@ See [.github/workflows/README.md](./.github/workflows/README.md) for detailed se
## License
AGPL-3.0-only - See the root repository for full license information.
AGPL-3.0-only - See [LICENSE.md](./LICENSE.md) for full license information.

1
sonar-project.properties Normal file
View File

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