Skip to content

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 28 Jul 13:28
· 658 commits to main since this release
c529602

First release cut through the automated pipeline. The eleven modules that
landed since 2.0.0 — payments, copilot, verifactu, recalls, schedules,
notifications, periodontogram, clinical_notes, accounting_export,
migration_import, whatsapp_kapso — are listed per-PR in the generated
release notes and documented in their own module CHANGELOGs; the
narrative version of that work belongs to the next major.

Added

  • Prebuilt images and a one-command install. Tagging a release now
    builds and publishes ghcr.io/martinezsalmeron/dentalpin-backend and
    -frontend, and publishes the GitHub Release with notes taken from
    this file. docker-compose.prod.yml runs the stack straight from those
    images with no clone and no build; a Caddy container fronts both
    services on a single origin, so TLS is provisioned automatically from
    PUBLIC_URL and there is no CORS to configure. One image serves every
    deployment — Nuxt overrides runtimeConfig.public.apiBaseUrl from
    NUXT_PUBLIC_API_BASE_URL at boot rather than baking the URL in.

  • First-time setup assistant (issue #85). A fresh install (no users)
    now bootstraps from the UI: GET /api/v1/auth/setup/status reports
    whether the system is initialized, and POST /api/v1/auth/setup
    atomically creates the first clinic + admin user + admin membership and
    returns tokens. The endpoint is self-closing (409 once any account
    exists). The frontend redirects unauthenticated visitors of an empty
    system to a 2-step /setup wizard (admin account → clinic basics);
    remaining configuration is handled by the existing onboarding checklist.

Changed

  • Removed the public POST /api/v1/auth/register endpoint. It created
    orphan users with no clinic membership (unusable, and unused by the UI);
    the first-run setup assistant replaces it.

  • Alembic history squashed. The 29-migration main-linear chain
    inherited from Fase A collapsed into one 0001_core_initial for
    core tables + 11 module-owned initials under
    backend/app/modules/<name>/migrations/versions/<mod>_0001_initial.py.
    Each module's initial lives in its own package so community module
    authors can pattern-match their own migrations on the official
    examples. Cross-module FKs live on the "late" side — the only
    circular dep (appointment_treatments.planned_treatment_item_id
    planned_treatment_items) is created in tp_0001 after both
    tables exist. Round-trip upgrade head → downgrade base → upgrade head is clean and test_alembic_roundtrip no longer xfails.

Fixed

  • docker-compose.yml hardcoded http://localhost:8000 as the frontend's
    API base (build arg + runtime env), so the documented API_BASE_URL in
    .env had no effect and the app was unreachable from any device other
    than the Docker host — the browser resolved localhost to itself.
    Both now read ${API_BASE_URL:-http://localhost:8000}.

  • Clinic timezone selector only offered 15 curated European/American
    zones. It now lists the runtime's full IANA set (Intl.supportedValuesOf)
    in a searchable USelectMenu; the backend already validated against
    zoneinfo, so any IANA id was accepted all along.

Install

curl -O https://raw.githubusercontent.com/martinezsalmeron/dentalpin/main/docker-compose.prod.yml
curl -O https://raw.githubusercontent.com/martinezsalmeron/dentalpin/main/Caddyfile
curl -o .env https://raw.githubusercontent.com/martinezsalmeron/dentalpin/main/.env.prod.example
# set PUBLIC_URL, POSTGRES_PASSWORD, SECRET_KEY
# and DENTALPIN_VERSION=2.1.0 to pin this release, then:
docker compose -f docker-compose.prod.yml up -d

Images: ghcr.io/martinezsalmeron/dentalpin-backend:2.1.0 · ghcr.io/martinezsalmeron/dentalpin-frontend:2.1.0

What's Changed

New Contributors

Full Changelog: v2.0.0...v2.1.0