c51f1ce34a6ba194f8bccde9d5eb56d8a5e7722d
Task creation/update responses were using UTC time for kanban column categorization, causing tasks to incorrectly appear as overdue when the server had passed midnight UTC but the user's local time was still the previous day. Changes: - Add timezone-aware response functions (NewTaskResponseWithTime, etc.) - Pass userNow from middleware to all task service methods - Update handlers to use timezone-aware time from X-Timezone header - Update tests to pass the now parameter 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Casera API (Go)
Go implementation of the Casera property management API, built with Gin, GORM, and GoAdmin.
Tech Stack
- HTTP Framework: Gin
- 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%