c2e880031228f4feb9fc4ef56c208057c6819370
When a user explicitly edited a task's due date, the backend was only updating NextDueDate if the task had no completions. For recurring tasks with completions, this caused the UI to show stale NextDueDate values since effectiveDueDate prioritizes NextDueDate over DueDate. Now always updates NextDueDate when user explicitly edits due date. Completion logic will still recalculate NextDueDate when task is completed. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Casera API (Go)
Go implementation of the Casera property management API, built with Echo, GORM, and GoAdmin.
Tech Stack
- HTTP Framework: Echo v4
- ORM: GORM with PostgreSQL
- Push Notifications: Direct APNs (via apns2) + FCM HTTP API
- Admin Panel: GoAdmin
- Background Jobs: Asynq
- Caching: Redis
- Logging: zerolog
- Configuration: Viper
Quick Start
Prerequisites
- Go 1.21+
- PostgreSQL 15+
- Redis 7+
Development Setup
# Install dependencies
make deps
# Copy environment file
cp .env.example .env
# Edit .env with your configuration
# Run the API server
make run
Docker Setup
# Start all services
make docker-up
# View logs
make docker-logs
# Stop services
make docker-down
Project Structure
myCribAPI-go/
├── cmd/
│ ├── api/main.go # API server entry point
│ ├── worker/main.go # Background worker entry point
│ └── admin/main.go # GoAdmin server entry point
├── internal/
│ ├── config/ # Configuration management
│ ├── models/ # GORM models
│ ├── database/ # Database connection
│ ├── repositories/ # Data access layer
│ ├── services/ # Business logic
│ ├── handlers/ # HTTP handlers
│ ├── middleware/ # Gin middleware
│ ├── dto/ # Request/Response DTOs
│ ├── router/ # Route setup
│ ├── push/ # APNs/FCM push notifications
│ ├── worker/ # Asynq jobs
│ └── admin/ # GoAdmin tables
├── pkg/
│ ├── utils/ # Utilities
│ └── errors/ # Error types
├── migrations/ # SQL migrations
├── templates/emails/ # Email templates
├── docker/ # Docker files
├── go.mod
└── Makefile
API Endpoints
The API maintains 100% compatibility with the Django version.
Public Endpoints (No Auth)
GET /api/health/- Health checkPOST /api/auth/login/- LoginPOST /api/auth/register/- RegisterGET /api/static_data/- Cached lookups
Protected Endpoints (Token Auth)
GET /api/residences/- List residencesGET /api/tasks/- List tasksGET /api/tasks/by-residence/:id/- Kanban board- See full API documentation in the Django project
Configuration
Environment variables (see .env.example):
| Variable | Description | Default |
|---|---|---|
PORT |
Server port | 8000 |
DEBUG |
Debug mode | false |
SECRET_KEY |
JWT secret | required |
POSTGRES_* |
Database config | - |
REDIS_URL |
Redis URL | redis://localhost:6379/0 |
APNS_* |
iOS push config | - |
FCM_SERVER_KEY |
Android push key | - |
Development
# Run tests
make test
# Run tests with coverage
make test-coverage
# Run linter
make lint
# Format code
make fmt
Database
This Go version uses the same PostgreSQL database as the Django version. GORM models are mapped to Django's table names:
auth_user- Django's User modeluser_authtoken- Auth tokensresidence_residence- Residencestask_task- Tasks
Seeding Data
Seed files are located in seeds/:
001_lookups.sql- Lookup tables (residence types, task categories, priorities, etc.)002_test_data.sql- Test users, residences, tasks, contractors, etc.
Local Development
# Seed lookup tables
./dev.sh seed
# Seed test data
./dev.sh seed-test
Production (Dokku)
# Seed lookup tables (required)
cat seeds/001_lookups.sql | dokku postgres:connect casera-db
# Seed test data
cat seeds/002_test_data.sql | dokku postgres:connect casera-db
Test Users
All test users have password: password123
| Username | Tier | Notes | |
|---|---|---|---|
| admin | admin@example.com | Pro | Admin user |
| john | john@example.com | Pro | Owns 2 residences |
| jane | jane@example.com | Free | Owns 1 residence, shared access to residence 1 |
| bob | bob@example.com | Free | Owns 1 residence |
Test Data Includes
- 4 residences (house, beach house, apartment, condo)
- 4 contractors with specialties
- 10 tasks across residences
- Documents/warranties
- Notifications
Migration from Django
This is a full rewrite that maintains API compatibility. The mobile clients (KMM) work with both versions without changes.
License
Proprietary - Casera
Description
Languages
Go
75.5%
TypeScript
20.3%
Shell
2.4%
HTML
0.7%
CSS
0.7%
Other
0.2%