Rebrand from Casera/MyCrib to honeyDue
Total rebrand across all Go API source files: - Go module path: casera-api -> honeydue-api - All imports updated (130+ files) - Docker: containers, images, networks renamed - Email templates: support email, noreply, icon URL - Domains: casera.app/mycrib.treytartt.com -> honeyDue.treytartt.com - Bundle IDs: com.tt.casera -> com.tt.honeyDue - IAP product IDs updated - Landing page, admin panel, config defaults - Seeds, CI workflows, Makefile, docs - Database table names preserved (no migration needed) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,7 @@ TIMEZONE=UTC
|
||||
SECRET_KEY=your-secret-key-here-change-this-in-production
|
||||
|
||||
# Database Settings (PostgreSQL)
|
||||
POSTGRES_DB=casera
|
||||
POSTGRES_DB=honeydue
|
||||
POSTGRES_USER=postgres
|
||||
POSTGRES_PASSWORD=change-this-secure-password
|
||||
DB_HOST=localhost
|
||||
@@ -26,14 +26,14 @@ EMAIL_PORT=587
|
||||
EMAIL_USE_TLS=true
|
||||
EMAIL_HOST_USER=your-email@gmail.com
|
||||
EMAIL_HOST_PASSWORD=your-app-password
|
||||
DEFAULT_FROM_EMAIL=Casera <noreply@casera.com>
|
||||
DEFAULT_FROM_EMAIL=honeyDue <noreply@honeyDue.treytartt.com>
|
||||
|
||||
# APNs Settings (iOS Push Notifications)
|
||||
# Direct APNs integration - no external push server needed
|
||||
APNS_AUTH_KEY_PATH=/path/to/AuthKey_XXXXXX.p8
|
||||
APNS_AUTH_KEY_ID=XXXXXXXXXX
|
||||
APNS_TEAM_ID=XXXXXXXXXX
|
||||
APNS_TOPIC=com.example.casera
|
||||
APNS_TOPIC=com.tt.honeyDue
|
||||
APNS_PRODUCTION=false # Set to true for production APNs, false for sandbox
|
||||
|
||||
# FCM Settings (Android Push Notifications)
|
||||
|
||||
4
.github/workflows/backend-ci.yml
vendored
4
.github/workflows/backend-ci.yml
vendored
@@ -60,10 +60,10 @@ jobs:
|
||||
cache: true
|
||||
|
||||
- name: Build API
|
||||
run: go build -ldflags "-s -w" -o bin/casera-api ./cmd/api
|
||||
run: go build -ldflags "-s -w" -o bin/honeydue-api ./cmd/api
|
||||
|
||||
- name: Build Worker
|
||||
run: go build -ldflags "-s -w" -o bin/casera-worker ./cmd/worker
|
||||
run: go build -ldflags "-s -w" -o bin/honeydue-worker ./cmd/worker
|
||||
|
||||
lint:
|
||||
name: Lint
|
||||
|
||||
12
CLAUDE.md
12
CLAUDE.md
@@ -40,7 +40,7 @@ This document contains:
|
||||
**Quick reference:**
|
||||
```go
|
||||
// Use these - DON'T write inline task logic
|
||||
import "github.com/treytartt/casera-api/internal/task"
|
||||
import "github.com/treytartt/honeydue-api/internal/task"
|
||||
|
||||
task.IsCompleted(t) // Check if task is completed
|
||||
task.IsOverdue(t, now) // Check if task is overdue
|
||||
@@ -50,7 +50,7 @@ task.CategorizeTask(t, 30) // Get kanban column for task
|
||||
|
||||
## Project Overview
|
||||
|
||||
Casera API is a Go REST API for the MyCrib/Casera property management platform. It provides backend services for iOS and Android mobile apps built with Kotlin Multiplatform.
|
||||
honeyDue API is a Go REST API for the HoneyDue/honeyDue property management platform. It provides backend services for iOS and Android mobile apps built with Kotlin Multiplatform.
|
||||
|
||||
**Tech Stack:**
|
||||
- **HTTP Framework**: Echo v4
|
||||
@@ -65,7 +65,7 @@ Casera API is a Go REST API for the MyCrib/Casera property management platform.
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
myCribAPI-go/
|
||||
honeyDueAPI-go/
|
||||
├── cmd/
|
||||
│ ├── api/main.go # API server entry point
|
||||
│ └── worker/main.go # Background worker entry point
|
||||
@@ -163,7 +163,7 @@ internal/task/
|
||||
|
||||
**Always use this package for task logic:**
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/task"
|
||||
import "github.com/treytartt/honeydue-api/internal/task"
|
||||
|
||||
// Predicates (in-memory checks)
|
||||
if task.IsCompleted(t) { ... }
|
||||
@@ -194,7 +194,7 @@ api.Use(middleware.AuthRequired(db))
|
||||
Use structured errors from `internal/apperrors/`:
|
||||
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/apperrors"
|
||||
import "github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
|
||||
// Return typed errors
|
||||
return apperrors.NewNotFoundError("task", taskID)
|
||||
@@ -401,5 +401,5 @@ func TestTaskHandler_Create(t *testing.T) {
|
||||
|
||||
## Related Repositories
|
||||
|
||||
- **Mobile App**: `../MyCribKMM` - Kotlin Multiplatform iOS/Android app
|
||||
- **Mobile App**: `../HoneyDueKMM` - Kotlin Multiplatform iOS/Android app
|
||||
- **Root Docs**: `../CLAUDE.md` - Full-stack documentation
|
||||
|
||||
10
Makefile
10
Makefile
@@ -1,8 +1,8 @@
|
||||
.PHONY: build run test contract-test clean deps lint docker-build docker-up docker-down migrate
|
||||
|
||||
# Binary names
|
||||
API_BINARY=casera-api
|
||||
WORKER_BINARY=casera-worker
|
||||
API_BINARY=honeydue-api
|
||||
WORKER_BINARY=honeydue-worker
|
||||
|
||||
# Build flags
|
||||
LDFLAGS=-ldflags "-s -w"
|
||||
@@ -85,9 +85,9 @@ docker-restart:
|
||||
|
||||
# Docker commands (prod — builds production images)
|
||||
docker-build-prod:
|
||||
docker build --target api -t $${REGISTRY:-ghcr.io/treytartt}/casera-api:$${TAG:-latest} .
|
||||
docker build --target worker -t $${REGISTRY:-ghcr.io/treytartt}/casera-worker:$${TAG:-latest} .
|
||||
docker build --target admin -t $${REGISTRY:-ghcr.io/treytartt}/casera-admin:$${TAG:-latest} .
|
||||
docker build --target api -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-api:$${TAG:-latest} .
|
||||
docker build --target worker -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-worker:$${TAG:-latest} .
|
||||
docker build --target admin -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-admin:$${TAG:-latest} .
|
||||
|
||||
# Database migrations
|
||||
migrate-up:
|
||||
|
||||
42
README.md
42
README.md
@@ -1,6 +1,6 @@
|
||||
# Casera API
|
||||
# honeyDue API
|
||||
|
||||
Go REST API for the Casera (MyCrib) property management platform. Powers iOS and Android mobile apps built with Kotlin Multiplatform.
|
||||
Go REST API for the honeyDue property management platform. Powers iOS and Android mobile apps built with Kotlin Multiplatform.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
@@ -31,7 +31,7 @@ This starts PostgreSQL, Redis, the API server, background worker, and admin pane
|
||||
```bash
|
||||
# 1. Clone the repo
|
||||
git clone <repo-url>
|
||||
cd myCribAPI-go
|
||||
cd honeyDueAPI-go
|
||||
|
||||
# 2. Create your environment file
|
||||
cp .env.example .env
|
||||
@@ -41,11 +41,11 @@ cp .env.example .env
|
||||
make docker-dev
|
||||
|
||||
# 4. Seed the database with lookup data (required)
|
||||
docker exec -i casera-db psql -U casera -d casera < seeds/001_lookups.sql
|
||||
docker exec -i honeydue-db psql -U honeydue -d honeydue < seeds/001_lookups.sql
|
||||
|
||||
# 5. (Optional) Seed test data — creates test users, residences, tasks
|
||||
docker exec -i casera-db psql -U casera -d casera < seeds/002_test_data.sql
|
||||
docker exec -i casera-db psql -U casera -d casera < seeds/003_task_templates.sql
|
||||
docker exec -i honeydue-db psql -U honeydue -d honeydue < seeds/002_test_data.sql
|
||||
docker exec -i honeydue-db psql -U honeydue -d honeydue < seeds/003_task_templates.sql
|
||||
|
||||
# 6. Verify the API is running
|
||||
curl http://localhost:8000/api/health/
|
||||
@@ -60,7 +60,7 @@ Use Docker for PostgreSQL and Redis, but run the Go server natively for faster i
|
||||
```bash
|
||||
# 1. Clone and enter the repo
|
||||
git clone <repo-url>
|
||||
cd myCribAPI-go
|
||||
cd honeyDueAPI-go
|
||||
|
||||
# 2. Install Go dependencies
|
||||
make deps
|
||||
@@ -77,9 +77,9 @@ cp .env.example .env
|
||||
# - Set REDIS_URL=redis://localhost:6379/0
|
||||
|
||||
# 5. Seed the database
|
||||
psql -h localhost -p 5433 -U casera -d casera < seeds/001_lookups.sql
|
||||
psql -h localhost -p 5433 -U casera -d casera < seeds/002_test_data.sql
|
||||
psql -h localhost -p 5433 -U casera -d casera < seeds/003_task_templates.sql
|
||||
psql -h localhost -p 5433 -U honeydue -d honeydue < seeds/001_lookups.sql
|
||||
psql -h localhost -p 5433 -U honeydue -d honeydue < seeds/002_test_data.sql
|
||||
psql -h localhost -p 5433 -U honeydue -d honeydue < seeds/003_task_templates.sql
|
||||
|
||||
# 6. Run the API server
|
||||
make run
|
||||
@@ -101,7 +101,7 @@ brew services start postgresql@16
|
||||
brew services start redis
|
||||
|
||||
# Create the database
|
||||
createdb casera
|
||||
createdb honeydue
|
||||
|
||||
# Then follow Option B steps 2-7, using:
|
||||
# DB_HOST=localhost, DB_PORT=5432, POSTGRES_USER=<your-user>, POSTGRES_PASSWORD=<your-password>
|
||||
@@ -116,7 +116,7 @@ Copy `.env.example` to `.env` and configure:
|
||||
| `PORT` | Server port | `8000` | No |
|
||||
| `DEBUG` | Enable debug logging | `true` | No |
|
||||
| `SECRET_KEY` | JWT signing secret (32+ chars) | — | **Yes** |
|
||||
| `POSTGRES_DB` | Database name | `casera` | Yes |
|
||||
| `POSTGRES_DB` | Database name | `honeydue` | Yes |
|
||||
| `POSTGRES_USER` | Database user | `postgres` | Yes |
|
||||
| `POSTGRES_PASSWORD` | Database password | — | Yes |
|
||||
| `DB_HOST` | Database host | `localhost` | Yes |
|
||||
@@ -133,7 +133,7 @@ Copy `.env.example` to `.env` and configure:
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
myCribAPI-go/
|
||||
honeyDueAPI-go/
|
||||
├── cmd/
|
||||
│ ├── api/main.go # API server entry point
|
||||
│ └── worker/main.go # Background worker entry point
|
||||
@@ -266,10 +266,10 @@ All protected endpoints require an `Authorization: Token <token>` header.
|
||||
git push dokku main
|
||||
|
||||
# Seed lookup data
|
||||
cat seeds/001_lookups.sql | dokku postgres:connect casera-db
|
||||
cat seeds/001_lookups.sql | dokku postgres:connect honeydue-db
|
||||
|
||||
# Check logs
|
||||
dokku logs casera-api -t
|
||||
dokku logs honeydue-api -t
|
||||
```
|
||||
|
||||
### Docker Swarm
|
||||
@@ -277,20 +277,20 @@ dokku logs casera-api -t
|
||||
```bash
|
||||
# Build and push production images
|
||||
make docker-build-prod
|
||||
docker push ${REGISTRY}/casera-api:${TAG}
|
||||
docker push ${REGISTRY}/casera-worker:${TAG}
|
||||
docker push ${REGISTRY}/casera-admin:${TAG}
|
||||
docker push ${REGISTRY}/honeydue-api:${TAG}
|
||||
docker push ${REGISTRY}/honeydue-worker:${TAG}
|
||||
docker push ${REGISTRY}/honeydue-admin:${TAG}
|
||||
|
||||
# Deploy the stack (all env vars must be set in .env or environment)
|
||||
docker stack deploy -c docker-compose.yml casera
|
||||
docker stack deploy -c docker-compose.yml honeydue
|
||||
```
|
||||
|
||||
## Related Projects
|
||||
|
||||
- **Mobile App (KMM)**: `../MyCribKMM` — Kotlin Multiplatform iOS/Android client
|
||||
- **Mobile App (KMM)**: `../HoneyDueKMM` — Kotlin Multiplatform iOS/Android client
|
||||
- **Task Logic Docs**: `docs/TASK_LOGIC_ARCHITECTURE.md` — required reading before task-related work
|
||||
- **Push Notification Docs**: `docs/PUSH_NOTIFICATIONS.md`
|
||||
|
||||
## License
|
||||
|
||||
Proprietary — Casera
|
||||
Proprietary — honeyDue
|
||||
|
||||
@@ -239,55 +239,55 @@ export default function AutomationReferencePage() {
|
||||
<TableBody>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Welcome Email</TableCell>
|
||||
<TableCell>Welcome to Casera - Verify Your Email</TableCell>
|
||||
<TableCell>Welcome to honeyDue - Verify Your Email</TableCell>
|
||||
<TableCell>User registration (email/password)</TableCell>
|
||||
<TableCell>24 hours (verification code)</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Apple Welcome</TableCell>
|
||||
<TableCell>Welcome to Casera!</TableCell>
|
||||
<TableCell>Welcome to honeyDue!</TableCell>
|
||||
<TableCell>Apple Sign In registration</TableCell>
|
||||
<TableCell>-</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Google Welcome</TableCell>
|
||||
<TableCell>Welcome to Casera!</TableCell>
|
||||
<TableCell>Welcome to honeyDue!</TableCell>
|
||||
<TableCell>Google Sign In registration</TableCell>
|
||||
<TableCell>-</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Post-Verification</TableCell>
|
||||
<TableCell>You're All Set! Getting Started with Casera</TableCell>
|
||||
<TableCell>You're All Set! Getting Started with honeyDue</TableCell>
|
||||
<TableCell>After email verification</TableCell>
|
||||
<TableCell>-</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Verification Email</TableCell>
|
||||
<TableCell>Casera - Verify Your Email</TableCell>
|
||||
<TableCell>honeyDue - Verify Your Email</TableCell>
|
||||
<TableCell>Resend verification code</TableCell>
|
||||
<TableCell>24 hours</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Password Reset</TableCell>
|
||||
<TableCell>Casera - Password Reset Request</TableCell>
|
||||
<TableCell>honeyDue - Password Reset Request</TableCell>
|
||||
<TableCell>Password reset request</TableCell>
|
||||
<TableCell>15 minutes</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Password Changed</TableCell>
|
||||
<TableCell>Casera - Your Password Has Been Changed</TableCell>
|
||||
<TableCell>honeyDue - Your Password Has Been Changed</TableCell>
|
||||
<TableCell>After password change</TableCell>
|
||||
<TableCell>-</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Task Completed</TableCell>
|
||||
<TableCell>Casera - Task Completed: [Task Title]</TableCell>
|
||||
<TableCell>honeyDue - Task Completed: [Task Title]</TableCell>
|
||||
<TableCell>When task is completed (if email_task_completed = true)</TableCell>
|
||||
<TableCell>-</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">Tasks Report</TableCell>
|
||||
<TableCell>Casera - Tasks Report for [Residence]</TableCell>
|
||||
<TableCell>honeyDue - Tasks Report for [Residence]</TableCell>
|
||||
<TableCell>User requests PDF export</TableCell>
|
||||
<TableCell>-</TableCell>
|
||||
</TableRow>
|
||||
@@ -311,14 +311,14 @@ export default function AutomationReferencePage() {
|
||||
<TableCell className="font-medium">
|
||||
<Badge variant="outline">no_residence</Badge>
|
||||
</TableCell>
|
||||
<TableCell>Get started with Casera - Add your first property</TableCell>
|
||||
<TableCell>Get started with honeyDue - Add your first property</TableCell>
|
||||
<TableCell>2+ days since registration, no residence created</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className="font-medium">
|
||||
<Badge variant="outline">no_tasks</Badge>
|
||||
</TableCell>
|
||||
<TableCell>Stay on top of home maintenance with Casera</TableCell>
|
||||
<TableCell>Stay on top of home maintenance with honeyDue</TableCell>
|
||||
<TableCell>5+ days since first residence, no tasks created</TableCell>
|
||||
</TableRow>
|
||||
</TableBody>
|
||||
|
||||
@@ -42,9 +42,9 @@ export function UserDetailClient() {
|
||||
const [showPushDialog, setShowPushDialog] = useState(false);
|
||||
const [showEmailDialog, setShowEmailDialog] = useState(false);
|
||||
const [pushTitle, setPushTitle] = useState('Test Notification');
|
||||
const [pushBody, setPushBody] = useState('This is a test push notification from Casera Admin.');
|
||||
const [emailSubject, setEmailSubject] = useState('Test Email from Casera');
|
||||
const [emailBody, setEmailBody] = useState('This is a test email sent from the Casera Admin Panel.');
|
||||
const [pushBody, setPushBody] = useState('This is a test push notification from honeyDue Admin.');
|
||||
const [emailSubject, setEmailSubject] = useState('Test Email from honeyDue');
|
||||
const [emailBody, setEmailBody] = useState('This is a test email sent from the honeyDue Admin Panel.');
|
||||
|
||||
const { data: user, isLoading, error } = useQuery({
|
||||
queryKey: ['user', userId],
|
||||
|
||||
@@ -15,8 +15,8 @@ const geistMono = Geist_Mono({
|
||||
});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Casera Admin",
|
||||
description: "Casera Administration Panel",
|
||||
title: "honeyDue Admin",
|
||||
description: "honeyDue Administration Panel",
|
||||
};
|
||||
|
||||
export default function RootLayout({
|
||||
|
||||
@@ -100,7 +100,7 @@ export function AppSidebar() {
|
||||
<SidebarHeader className="border-b px-6 py-4">
|
||||
<div className="flex items-center gap-2">
|
||||
<Building2 className="h-6 w-6" />
|
||||
<span className="font-semibold text-lg">Casera Admin</span>
|
||||
<span className="font-semibold text-lg">honeyDue Admin</span>
|
||||
</div>
|
||||
</SidebarHeader>
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ export function LoginForm() {
|
||||
<Card className="w-full max-w-md">
|
||||
<CardHeader className="space-y-1">
|
||||
<CardTitle className="text-2xl font-bold text-center">
|
||||
Casera Admin
|
||||
honeyDue Admin
|
||||
</CardTitle>
|
||||
<CardDescription className="text-center">
|
||||
Enter your credentials to access the admin panel
|
||||
@@ -53,7 +53,7 @@ export function LoginForm() {
|
||||
<Input
|
||||
id="email"
|
||||
type="email"
|
||||
placeholder="admin@casera.app"
|
||||
placeholder="admin@honeydue.app"
|
||||
value={email}
|
||||
onChange={(e) => setEmail(e.target.value)}
|
||||
required
|
||||
|
||||
4
app.json
4
app.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "casera-api",
|
||||
"description": "Casera API (Go)",
|
||||
"name": "honeydue-api",
|
||||
"description": "honeyDue API (Go)",
|
||||
"scripts": {},
|
||||
"healthchecks": {
|
||||
"web": [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"version": "1",
|
||||
"name": "Casera API (Go)",
|
||||
"name": "honeyDue API (Go)",
|
||||
"type": "collection",
|
||||
"ignore": [
|
||||
"node_modules",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
vars {
|
||||
base_url: https://casera.treytartt.com
|
||||
base_url: https://honeyDue.treytartt.com
|
||||
api_url: {{base_url}}/api
|
||||
auth_token: 64eea3e59ecdf58a35a4fb45f4797413a3f96456
|
||||
}
|
||||
|
||||
@@ -12,14 +12,14 @@ import (
|
||||
"github.com/rs/zerolog/log"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/database"
|
||||
"github.com/treytartt/casera-api/internal/i18n"
|
||||
"github.com/treytartt/casera-api/internal/monitoring"
|
||||
"github.com/treytartt/casera-api/internal/push"
|
||||
"github.com/treytartt/casera-api/internal/router"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/pkg/utils"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/database"
|
||||
"github.com/treytartt/honeydue-api/internal/i18n"
|
||||
"github.com/treytartt/honeydue-api/internal/monitoring"
|
||||
"github.com/treytartt/honeydue-api/internal/push"
|
||||
"github.com/treytartt/honeydue-api/internal/router"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/pkg/utils"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -48,7 +48,7 @@ func main() {
|
||||
Str("db_name", cfg.Database.Database).
|
||||
Str("db_user", cfg.Database.User).
|
||||
Str("redis_url", cfg.Redis.URL).
|
||||
Msg("Starting MyCrib API server")
|
||||
Msg("Starting HoneyDue API server")
|
||||
|
||||
// Connect to database (retry with backoff)
|
||||
var db *gorm.DB
|
||||
|
||||
@@ -11,14 +11,14 @@ import (
|
||||
"github.com/redis/go-redis/v9"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/database"
|
||||
"github.com/treytartt/casera-api/internal/monitoring"
|
||||
"github.com/treytartt/casera-api/internal/push"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/worker/jobs"
|
||||
"github.com/treytartt/casera-api/pkg/utils"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/database"
|
||||
"github.com/treytartt/honeydue-api/internal/monitoring"
|
||||
"github.com/treytartt/honeydue-api/internal/push"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/worker/jobs"
|
||||
"github.com/treytartt/honeydue-api/pkg/utils"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Deploy Folder
|
||||
|
||||
This folder is the full production deploy toolkit for `myCribAPI-go`.
|
||||
This folder is the full production deploy toolkit for `honeyDueAPI-go`.
|
||||
|
||||
Run deploy with:
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ DEPLOY_MANAGER_SSH_PORT=22
|
||||
DEPLOY_SSH_KEY_PATH=~/.ssh/id_ed25519
|
||||
|
||||
# Stack settings
|
||||
DEPLOY_STACK_NAME=casera
|
||||
DEPLOY_REMOTE_DIR=/opt/casera/deploy
|
||||
DEPLOY_STACK_NAME=honeydue
|
||||
DEPLOY_REMOTE_DIR=/opt/honeydue/deploy
|
||||
DEPLOY_WAIT_SECONDS=420
|
||||
DEPLOY_HEALTHCHECK_URL=https://api.casera.app/api/health/
|
||||
DEPLOY_HEALTHCHECK_URL=https://api.honeyDue.treytartt.com/api/health/
|
||||
|
||||
# Replicas and published ports
|
||||
API_REPLICAS=3
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
# API service settings
|
||||
DEBUG=false
|
||||
ALLOWED_HOSTS=api.casera.app,casera.app
|
||||
CORS_ALLOWED_ORIGINS=https://casera.app,https://admin.casera.app
|
||||
ALLOWED_HOSTS=api.honeyDue.treytartt.com,honeyDue.treytartt.com
|
||||
CORS_ALLOWED_ORIGINS=https://honeyDue.treytartt.com,https://admin.honeyDue.treytartt.com
|
||||
TIMEZONE=UTC
|
||||
BASE_URL=https://casera.app
|
||||
BASE_URL=https://honeyDue.treytartt.com
|
||||
PORT=8000
|
||||
|
||||
# Admin service settings
|
||||
NEXT_PUBLIC_API_URL=https://api.casera.app
|
||||
ADMIN_PANEL_URL=https://admin.casera.app
|
||||
NEXT_PUBLIC_API_URL=https://api.honeyDue.treytartt.com
|
||||
ADMIN_PANEL_URL=https://admin.honeyDue.treytartt.com
|
||||
|
||||
# Database (Neon recommended)
|
||||
DB_HOST=CHANGEME_NEON_HOST
|
||||
DB_PORT=5432
|
||||
POSTGRES_USER=CHANGEME_DB_USER
|
||||
POSTGRES_DB=casera
|
||||
POSTGRES_DB=honeydue
|
||||
DB_SSLMODE=require
|
||||
DB_MAX_OPEN_CONNS=25
|
||||
DB_MAX_IDLE_CONNS=10
|
||||
@@ -29,13 +29,13 @@ EMAIL_HOST=smtp.gmail.com
|
||||
EMAIL_PORT=587
|
||||
EMAIL_USE_TLS=true
|
||||
EMAIL_HOST_USER=CHANGEME_EMAIL_USER
|
||||
DEFAULT_FROM_EMAIL=Casera <noreply@casera.app>
|
||||
DEFAULT_FROM_EMAIL=honeyDue <noreply@honeyDue.treytartt.com>
|
||||
|
||||
# Push notifications
|
||||
# APNS private key goes in deploy/secrets/apns_auth_key.p8
|
||||
APNS_AUTH_KEY_ID=CHANGEME_APNS_KEY_ID
|
||||
APNS_TEAM_ID=CHANGEME_APNS_TEAM_ID
|
||||
APNS_TOPIC=com.tt.casera
|
||||
APNS_TOPIC=com.tt.honeyDue
|
||||
APNS_USE_SANDBOX=false
|
||||
APNS_PRODUCTION=true
|
||||
|
||||
|
||||
@@ -140,8 +140,8 @@ source "${PROD_ENV}"
|
||||
set +a
|
||||
|
||||
DEPLOY_MANAGER_SSH_PORT="${DEPLOY_MANAGER_SSH_PORT:-22}"
|
||||
DEPLOY_STACK_NAME="${DEPLOY_STACK_NAME:-casera}"
|
||||
DEPLOY_REMOTE_DIR="${DEPLOY_REMOTE_DIR:-/opt/casera/deploy}"
|
||||
DEPLOY_STACK_NAME="${DEPLOY_STACK_NAME:-honeydue}"
|
||||
DEPLOY_REMOTE_DIR="${DEPLOY_REMOTE_DIR:-/opt/honeydue/deploy}"
|
||||
DEPLOY_WAIT_SECONDS="${DEPLOY_WAIT_SECONDS:-420}"
|
||||
DEPLOY_TAG="${DEPLOY_TAG:-$(git -C "${REPO_DIR}" rev-parse --short HEAD)}"
|
||||
PUSH_LATEST_TAG="${PUSH_LATEST_TAG:-true}"
|
||||
@@ -183,9 +183,9 @@ if (( app_secret_len < 32 )); then
|
||||
fi
|
||||
|
||||
REGISTRY_PREFIX="${REGISTRY%/}/${REGISTRY_NAMESPACE#/}"
|
||||
API_IMAGE="${REGISTRY_PREFIX}/casera-api:${DEPLOY_TAG}"
|
||||
WORKER_IMAGE="${REGISTRY_PREFIX}/casera-worker:${DEPLOY_TAG}"
|
||||
ADMIN_IMAGE="${REGISTRY_PREFIX}/casera-admin:${DEPLOY_TAG}"
|
||||
API_IMAGE="${REGISTRY_PREFIX}/honeydue-api:${DEPLOY_TAG}"
|
||||
WORKER_IMAGE="${REGISTRY_PREFIX}/honeydue-worker:${DEPLOY_TAG}"
|
||||
ADMIN_IMAGE="${REGISTRY_PREFIX}/honeydue-admin:${DEPLOY_TAG}"
|
||||
|
||||
SSH_KEY_PATH="${DEPLOY_SSH_KEY_PATH:-}"
|
||||
if [[ -n "${SSH_KEY_PATH}" ]]; then
|
||||
@@ -232,12 +232,12 @@ if [[ "${SKIP_BUILD}" != "1" ]]; then
|
||||
|
||||
if [[ "${PUSH_LATEST_TAG}" == "true" ]]; then
|
||||
log "Updating :latest tags"
|
||||
docker tag "${API_IMAGE}" "${REGISTRY_PREFIX}/casera-api:latest"
|
||||
docker tag "${WORKER_IMAGE}" "${REGISTRY_PREFIX}/casera-worker:latest"
|
||||
docker tag "${ADMIN_IMAGE}" "${REGISTRY_PREFIX}/casera-admin:latest"
|
||||
docker push "${REGISTRY_PREFIX}/casera-api:latest"
|
||||
docker push "${REGISTRY_PREFIX}/casera-worker:latest"
|
||||
docker push "${REGISTRY_PREFIX}/casera-admin:latest"
|
||||
docker tag "${API_IMAGE}" "${REGISTRY_PREFIX}/honeydue-api:latest"
|
||||
docker tag "${WORKER_IMAGE}" "${REGISTRY_PREFIX}/honeydue-worker:latest"
|
||||
docker tag "${ADMIN_IMAGE}" "${REGISTRY_PREFIX}/honeydue-admin:latest"
|
||||
docker push "${REGISTRY_PREFIX}/honeydue-api:latest"
|
||||
docker push "${REGISTRY_PREFIX}/honeydue-worker:latest"
|
||||
docker push "${REGISTRY_PREFIX}/honeydue-admin:latest"
|
||||
fi
|
||||
else
|
||||
warn "SKIP_BUILD=1 set. Using prebuilt images for tag: ${DEPLOY_TAG}"
|
||||
|
||||
@@ -19,7 +19,7 @@ services:
|
||||
placement:
|
||||
max_replicas_per_node: 1
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
api:
|
||||
image: ${API_IMAGE}
|
||||
@@ -129,7 +129,7 @@ services:
|
||||
delay: 5s
|
||||
order: stop-first
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
admin:
|
||||
image: ${ADMIN_IMAGE}
|
||||
@@ -161,7 +161,7 @@ services:
|
||||
delay: 5s
|
||||
order: stop-first
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
worker:
|
||||
image: ${WORKER_IMAGE}
|
||||
@@ -236,7 +236,7 @@ services:
|
||||
delay: 5s
|
||||
order: stop-first
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
dozzle:
|
||||
image: amir20/dozzle:latest
|
||||
@@ -258,14 +258,14 @@ services:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
volumes:
|
||||
redis_data:
|
||||
uploads:
|
||||
|
||||
networks:
|
||||
casera-network:
|
||||
honeydue-network:
|
||||
driver: overlay
|
||||
driver_opts:
|
||||
encrypted: "true"
|
||||
|
||||
18
dev.sh
18
dev.sh
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# Development helper script for MyCrib API (Go)
|
||||
# Development helper script for HoneyDue API (Go)
|
||||
|
||||
set -e
|
||||
|
||||
@@ -67,7 +67,7 @@ case "$1" in
|
||||
;;
|
||||
db)
|
||||
echo "🐘 Connecting to PostgreSQL..."
|
||||
docker-compose $COMPOSE_FILES exec db psql -U ${POSTGRES_USER:-mycrib} -d ${POSTGRES_DB:-mycrib}
|
||||
docker-compose $COMPOSE_FILES exec db psql -U ${POSTGRES_USER:-honeydue} -d ${POSTGRES_DB:-honeydue}
|
||||
;;
|
||||
redis)
|
||||
echo "📮 Connecting to Redis..."
|
||||
@@ -75,23 +75,23 @@ case "$1" in
|
||||
;;
|
||||
seed)
|
||||
echo "🌱 Seeding lookup data..."
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/001_lookups.sql
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/001_lookups.sql
|
||||
echo "✅ Lookup data seeded"
|
||||
;;
|
||||
seed-test)
|
||||
echo "🧪 Seeding test data..."
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/002_test_data.sql
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/002_test_data.sql
|
||||
echo "✅ Test data seeded"
|
||||
;;
|
||||
seed-all)
|
||||
echo "🌱 Seeding all data..."
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/001_lookups.sql
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/002_test_data.sql
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/001_lookups.sql
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/002_test_data.sql
|
||||
echo "✅ All data seeded"
|
||||
;;
|
||||
seed-admin)
|
||||
echo "🔐 Seeding admin user..."
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < seeds/003_admin_user.sql
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < seeds/003_admin_user.sql
|
||||
echo "✅ Admin user seeded"
|
||||
;;
|
||||
admin-install)
|
||||
@@ -115,7 +115,7 @@ case "$1" in
|
||||
migrate)
|
||||
echo "📊 Running database migrations..."
|
||||
# GORM auto-migrates on API startup, but we need GoAdmin tables
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-mycrib} -f - < migrations/002_goadmin_tables.up.sql
|
||||
docker-compose $COMPOSE_FILES exec -T db psql -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-honeydue} -f - < migrations/002_goadmin_tables.up.sql
|
||||
echo "✅ Migrations complete"
|
||||
;;
|
||||
clean)
|
||||
@@ -134,7 +134,7 @@ case "$1" in
|
||||
echo "🚀 Starting development environment..."
|
||||
docker-compose $COMPOSE_FILES up
|
||||
else
|
||||
echo "Development helper script for MyCrib API (Go)"
|
||||
echo "Development helper script for HoneyDue API (Go)"
|
||||
echo ""
|
||||
echo "Usage: ./dev.sh [command]"
|
||||
echo ""
|
||||
|
||||
@@ -6,28 +6,28 @@ services:
|
||||
# PostgreSQL Database
|
||||
db:
|
||||
image: postgres:16-alpine
|
||||
container_name: casera-db
|
||||
container_name: honeydue-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: ${POSTGRES_USER:-casera}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password}
|
||||
POSTGRES_DB: ${POSTGRES_DB:-casera}
|
||||
POSTGRES_USER: ${POSTGRES_USER:-honeydue}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
|
||||
POSTGRES_DB: ${POSTGRES_DB:-honeydue}
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
ports:
|
||||
- "${DB_PORT:-5433}:5432" # 5433 externally to avoid conflicts with local postgres
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-casera} -d ${POSTGRES_DB:-casera}"]
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-honeydue} -d ${POSTGRES_DB:-honeydue}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Redis Cache
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
container_name: casera-redis
|
||||
container_name: honeydue-redis
|
||||
restart: unless-stopped
|
||||
command: redis-server --appendonly yes
|
||||
volumes:
|
||||
@@ -40,14 +40,14 @@ services:
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Casera API
|
||||
# honeyDue API
|
||||
api:
|
||||
build:
|
||||
context: .
|
||||
target: api
|
||||
container_name: casera-api
|
||||
container_name: honeydue-api
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${PORT:-8000}:8000"
|
||||
@@ -61,9 +61,9 @@ services:
|
||||
# Database
|
||||
DB_HOST: db
|
||||
DB_PORT: "5432"
|
||||
POSTGRES_USER: ${POSTGRES_USER:-casera}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password}
|
||||
POSTGRES_DB: ${POSTGRES_DB:-casera}
|
||||
POSTGRES_USER: ${POSTGRES_USER:-honeydue}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
|
||||
POSTGRES_DB: ${POSTGRES_DB:-honeydue}
|
||||
DB_SSLMODE: "disable"
|
||||
|
||||
# Redis
|
||||
@@ -77,14 +77,14 @@ services:
|
||||
EMAIL_PORT: ${EMAIL_PORT:-587}
|
||||
EMAIL_HOST_USER: ${EMAIL_HOST_USER}
|
||||
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD}
|
||||
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-Casera <noreply@casera.com>}
|
||||
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-honeyDue <noreply@honeyDue.treytartt.com>}
|
||||
EMAIL_USE_TLS: "true"
|
||||
|
||||
# Push Notifications
|
||||
APNS_AUTH_KEY_PATH: ${APNS_AUTH_KEY_PATH}
|
||||
APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID}
|
||||
APNS_TEAM_ID: ${APNS_TEAM_ID}
|
||||
APNS_TOPIC: ${APNS_TOPIC:-com.example.casera}
|
||||
APNS_TOPIC: ${APNS_TOPIC:-com.tt.honeyDue}
|
||||
APNS_USE_SANDBOX: "true"
|
||||
FCM_SERVER_KEY: ${FCM_SERVER_KEY}
|
||||
volumes:
|
||||
@@ -102,14 +102,14 @@ services:
|
||||
start_period: 10s
|
||||
retries: 3
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Casera Admin Panel (Next.js)
|
||||
# honeyDue Admin Panel (Next.js)
|
||||
admin:
|
||||
build:
|
||||
context: .
|
||||
target: admin
|
||||
container_name: casera-admin
|
||||
container_name: honeydue-admin
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${ADMIN_PORT:-3000}:3000"
|
||||
@@ -126,22 +126,22 @@ services:
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Casera Worker (Background Jobs)
|
||||
# honeyDue Worker (Background Jobs)
|
||||
worker:
|
||||
build:
|
||||
context: .
|
||||
target: worker
|
||||
container_name: casera-worker
|
||||
container_name: honeydue-worker
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# Database
|
||||
DB_HOST: db
|
||||
DB_PORT: "5432"
|
||||
POSTGRES_USER: ${POSTGRES_USER:-casera}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password}
|
||||
POSTGRES_DB: ${POSTGRES_DB:-casera}
|
||||
POSTGRES_USER: ${POSTGRES_USER:-honeydue}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
|
||||
POSTGRES_DB: ${POSTGRES_DB:-honeydue}
|
||||
DB_SSLMODE: "disable"
|
||||
|
||||
# Redis
|
||||
@@ -154,7 +154,7 @@ services:
|
||||
APNS_AUTH_KEY_PATH: "/certs/apns_key.p8"
|
||||
APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID}
|
||||
APNS_TEAM_ID: ${APNS_TEAM_ID}
|
||||
APNS_TOPIC: ${APNS_TOPIC:-com.example.casera}
|
||||
APNS_TOPIC: ${APNS_TOPIC:-com.tt.honeyDue}
|
||||
APNS_USE_SANDBOX: "true"
|
||||
FCM_SERVER_KEY: ${FCM_SERVER_KEY}
|
||||
|
||||
@@ -163,7 +163,7 @@ services:
|
||||
EMAIL_PORT: ${EMAIL_PORT:-587}
|
||||
EMAIL_HOST_USER: ${EMAIL_HOST_USER}
|
||||
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD}
|
||||
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-Casera <noreply@casera.com>}
|
||||
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-honeyDue <noreply@honeyDue.treytartt.com>}
|
||||
EMAIL_USE_TLS: "true"
|
||||
|
||||
# Worker settings (UTC hours for scheduled jobs)
|
||||
@@ -178,12 +178,12 @@ services:
|
||||
redis:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Dozzle — lightweight real-time log viewer
|
||||
dozzle:
|
||||
image: amir20/dozzle:latest
|
||||
container_name: casera-dozzle
|
||||
container_name: honeydue-dozzle
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${DOZZLE_PORT:-9999}:8080"
|
||||
@@ -192,12 +192,12 @@ services:
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
|
||||
networks:
|
||||
casera-network:
|
||||
honeydue-network:
|
||||
driver: bridge
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Production / Docker Swarm compose file
|
||||
# Usage:
|
||||
# docker stack deploy -c docker-compose.yml casera
|
||||
# docker stack deploy -c docker-compose.yml honeydue
|
||||
#
|
||||
# All env vars must be set in the environment or a .env file.
|
||||
# No dev-safe defaults — missing vars will fail the deploy.
|
||||
@@ -30,7 +30,7 @@ services:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Redis Cache
|
||||
redis:
|
||||
@@ -50,11 +50,11 @@ services:
|
||||
condition: any
|
||||
delay: 5s
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Casera API
|
||||
# honeyDue API
|
||||
api:
|
||||
image: ${REGISTRY:-ghcr.io/treytartt}/casera-api:${TAG:-latest}
|
||||
image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-api:${TAG:-latest}
|
||||
ports:
|
||||
- "${PORT:-8000}:8000"
|
||||
environment:
|
||||
@@ -113,11 +113,11 @@ services:
|
||||
delay: 10s
|
||||
order: start-first
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Casera Admin Panel (Next.js)
|
||||
# honeyDue Admin Panel (Next.js)
|
||||
admin:
|
||||
image: ${REGISTRY:-ghcr.io/treytartt}/casera-admin:${TAG:-latest}
|
||||
image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-admin:${TAG:-latest}
|
||||
ports:
|
||||
- "${ADMIN_PORT:-3000}:3000"
|
||||
environment:
|
||||
@@ -139,11 +139,11 @@ services:
|
||||
delay: 10s
|
||||
order: start-first
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Casera Worker (Background Jobs)
|
||||
# honeyDue Worker (Background Jobs)
|
||||
worker:
|
||||
image: ${REGISTRY:-ghcr.io/treytartt}/casera-worker:${TAG:-latest}
|
||||
image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-worker:${TAG:-latest}
|
||||
environment:
|
||||
# Database
|
||||
DB_HOST: db
|
||||
@@ -187,7 +187,7 @@ services:
|
||||
condition: any
|
||||
delay: 5s
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
# Dozzle — lightweight real-time log viewer
|
||||
dozzle:
|
||||
@@ -207,7 +207,7 @@ services:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
networks:
|
||||
- casera-network
|
||||
- honeydue-network
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
@@ -216,5 +216,5 @@ volumes:
|
||||
uploads:
|
||||
|
||||
networks:
|
||||
casera-network:
|
||||
honeydue-network:
|
||||
driver: overlay
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# MyCrib Go Backend — Deep Audit Findings
|
||||
# HoneyDue Go Backend — Deep Audit Findings
|
||||
|
||||
**Date**: 2026-03-01
|
||||
**Scope**: All non-test `.go` files under `myCribAPI-go/`
|
||||
**Scope**: All non-test `.go` files under `honeyDueAPI-go/`
|
||||
**Agents**: 9 parallel audit agents covering security, authorization, data integrity, concurrency, performance, error handling, architecture compliance, API contracts, and cross-cutting logic
|
||||
|
||||
---
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
### SEC-04 | CRITICAL | Next.js admin password reset to "admin123" on every migration
|
||||
- **File**: `internal/database/database.go:447-463`
|
||||
- **What**: Lines 458-463 unconditionally update the admin@mycrib.com password to the bcrypt hash of "admin123" on every migration. The log message on line 463 even says "Updated admin@mycrib.com password to admin123."
|
||||
- **What**: Lines 458-463 unconditionally update the admin@honeydue.com password to the bcrypt hash of "admin123" on every migration. The log message on line 463 even says "Updated admin@honeydue.com password to admin123."
|
||||
- **Impact**: The admin API is permanently accessible with hardcoded credentials. Any attacker who discovers the endpoint can access full admin functionality.
|
||||
|
||||
### SEC-05 | CRITICAL | SQL injection via SortBy in all admin list endpoints
|
||||
@@ -236,7 +236,7 @@
|
||||
|
||||
### AUTH-06 | CRITICAL | Hardcoded admin credentials reset on every migration
|
||||
- **File**: `internal/database/database.go:372-382,447-463`
|
||||
- **What**: Hardcoded admin credentials (`admin@mycrib.com` / `admin123` and GoAdmin password of `admin`) are re-applied on every server restart/migration, overwriting any password changes.
|
||||
- **What**: Hardcoded admin credentials (`admin@honeydue.com` / `admin123` and GoAdmin password of `admin`) are re-applied on every server restart/migration, overwriting any password changes.
|
||||
- **Impact**: If these endpoints are accessible in production, any attacker with knowledge of these default credentials can gain full admin access.
|
||||
|
||||
### AUTH-07 | BUG | User-controlled category parameter enables storage path manipulation
|
||||
@@ -350,7 +350,7 @@
|
||||
|
||||
### DATA-07 | CRITICAL | Next.js admin password reset on every migration run
|
||||
- **File**: `internal/database/database.go:458-463`
|
||||
- **What**: Unconditionally updates admin@mycrib.com password to "admin123" on every migration.
|
||||
- **What**: Unconditionally updates admin@honeydue.com password to "admin123" on every migration.
|
||||
- **Impact**: Same persistent backdoor.
|
||||
|
||||
### DATA-08 | BUG | GetAllUsers/HasAccess silently wrong when associations not preloaded
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Dokku Deployment Guide for Casera API
|
||||
# Dokku Deployment Guide for honeyDue API
|
||||
|
||||
This guide provides step-by-step instructions for deploying the Casera Go API to a remote server using Dokku.
|
||||
This guide provides step-by-step instructions for deploying the honeyDue Go API to a remote server using Dokku.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@@ -90,7 +90,7 @@ sudo DOKKU_TAG=v0.34.4 bash bootstrap.sh
|
||||
|
||||
```bash
|
||||
# Set your domain (replace with your actual domain)
|
||||
dokku domains:set-global casera.treytartt.com
|
||||
dokku domains:set-global honeyDue.treytartt.com
|
||||
|
||||
# Add your SSH public key for deployments
|
||||
# Run this from your LOCAL machine:
|
||||
@@ -117,13 +117,13 @@ dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
|
||||
### 1. Create the Dokku App
|
||||
|
||||
```bash
|
||||
dokku apps:create casera-api
|
||||
dokku apps:create honeydue-api
|
||||
```
|
||||
|
||||
### 2. Set the Domain
|
||||
|
||||
```bash
|
||||
dokku domains:add casera-api api.casera.treytartt.com
|
||||
dokku domains:add honeydue-api api.honeyDue.treytartt.com
|
||||
```
|
||||
|
||||
### 3. Configure Buildpack (if needed)
|
||||
@@ -131,8 +131,8 @@ dokku domains:add casera-api api.casera.treytartt.com
|
||||
The app uses a Dockerfile, so Dokku will auto-detect it. If you need to force Docker builds:
|
||||
|
||||
```bash
|
||||
dokku builder:set casera-api build-dir .
|
||||
dokku builder-dockerfile:set casera-api dockerfile-path Dockerfile
|
||||
dokku builder:set honeydue-api build-dir .
|
||||
dokku builder-dockerfile:set honeydue-api dockerfile-path Dockerfile
|
||||
```
|
||||
|
||||
---
|
||||
@@ -143,20 +143,20 @@ dokku builder-dockerfile:set casera-api dockerfile-path Dockerfile
|
||||
|
||||
```bash
|
||||
# Create the database service
|
||||
dokku postgres:create casera-db
|
||||
dokku postgres:create honeydue-db
|
||||
|
||||
# Link to the app (automatically sets DATABASE_URL)
|
||||
dokku postgres:link casera-db casera-api
|
||||
dokku postgres:link honeydue-db honeydue-api
|
||||
```
|
||||
|
||||
### 2. Verify Connection
|
||||
|
||||
```bash
|
||||
# Check the connection info
|
||||
dokku postgres:info casera-db
|
||||
dokku postgres:info honeydue-db
|
||||
|
||||
# Connect to the database
|
||||
dokku postgres:connect casera-db
|
||||
dokku postgres:connect honeydue-db
|
||||
```
|
||||
|
||||
### 3. Set Individual Database Variables
|
||||
@@ -165,13 +165,13 @@ Dokku sets `DATABASE_URL` automatically, but the app expects individual variable
|
||||
|
||||
```bash
|
||||
# Get the database credentials
|
||||
dokku postgres:info casera-db
|
||||
dokku postgres:info honeydue-db
|
||||
|
||||
# Set individual variables (replace with actual values from info command)
|
||||
dokku config:set casera-api \
|
||||
DB_HOST=dokku-postgres-casera-db \
|
||||
dokku config:set honeydue-api \
|
||||
DB_HOST=dokku-postgres-honeydue-db \
|
||||
DB_PORT=5432 \
|
||||
POSTGRES_DB=casera_db \
|
||||
POSTGRES_DB=honeydue_db \
|
||||
POSTGRES_USER=postgres \
|
||||
POSTGRES_PASSWORD=1mJPfu6rzG9r6xukcGbUOU5NoCg0jKfa
|
||||
```
|
||||
@@ -184,16 +184,16 @@ dokku config:set casera-api \
|
||||
|
||||
```bash
|
||||
# Create the Redis service
|
||||
dokku redis:create casera-redis
|
||||
dokku redis:create honeydue-redis
|
||||
|
||||
# Link to the app (automatically sets REDIS_URL)
|
||||
dokku redis:link casera-redis casera-api
|
||||
dokku redis:link honeydue-redis honeydue-api
|
||||
```
|
||||
|
||||
### 2. Verify Connection
|
||||
|
||||
```bash
|
||||
dokku redis:info casera-redis
|
||||
dokku redis:info honeydue-redis
|
||||
```
|
||||
|
||||
---
|
||||
@@ -203,10 +203,10 @@ dokku redis:info casera-redis
|
||||
### 1. Required Variables
|
||||
|
||||
```bash
|
||||
dokku config:set casera-api \
|
||||
dokku config:set honeydue-api \
|
||||
PORT=5000 \
|
||||
DEBUG=false \
|
||||
ALLOWED_HOSTS=api.casera.treytartt.com,localhost \
|
||||
ALLOWED_HOSTS=api.honeyDue.treytartt.com,localhost \
|
||||
TIMEZONE=UTC \
|
||||
SECRET_KEY=8553813eda361017a02677ed504abdd331537cfe6f7cc407345f037cc22c75fc
|
||||
```
|
||||
@@ -214,20 +214,20 @@ dokku config:set casera-api \
|
||||
### 2. Email Configuration
|
||||
|
||||
```bash
|
||||
dokku config:set casera-api \
|
||||
dokku config:set honeydue-api \
|
||||
EMAIL_HOST=smtp.fastmail.com \
|
||||
EMAIL_PORT=587 \
|
||||
EMAIL_USE_TLS=true \
|
||||
EMAIL_HOST_USER=treytartt@fastmail.com \
|
||||
EMAIL_HOST_PASSWORD=2t9y4n4t497z5863 \
|
||||
DEFAULT_FROM_EMAIL="Casera <treytartt@fastmail.com>"
|
||||
DEFAULT_FROM_EMAIL="honeyDue <treytartt@fastmail.com>"
|
||||
```
|
||||
|
||||
### 3. Apple Sign In (Optional)
|
||||
|
||||
```bash
|
||||
dokku config:set casera-api \
|
||||
APPLE_CLIENT_ID=com.tt.casera.CaseraDev \
|
||||
dokku config:set honeydue-api \
|
||||
APPLE_CLIENT_ID=com.tt.honeyDue.honeyDueDev \
|
||||
APPLE_TEAM_ID=V3PF3M6B6U
|
||||
```
|
||||
|
||||
@@ -236,11 +236,11 @@ dokku config:set casera-api \
|
||||
The API uses direct APNs/FCM connections (no external push server needed):
|
||||
|
||||
```bash
|
||||
dokku config:set casera-api \
|
||||
dokku config:set honeydue-api \
|
||||
APNS_AUTH_KEY_PATH=/push_certs/AuthKey_R9N3SM2WD5.p8 \
|
||||
APNS_AUTH_KEY_ID=R9N3SM2WD5 \
|
||||
APNS_TEAM_ID=V3PF3M6B6U \
|
||||
APNS_TOPIC=com.tt.casera.CaseraDev \
|
||||
APNS_TOPIC=com.tt.honeyDue.honeyDueDev \
|
||||
APNS_PRODUCTION=true \
|
||||
FCM_SERVER_KEY=your-firebase-server-key
|
||||
```
|
||||
@@ -248,14 +248,14 @@ dokku config:set casera-api \
|
||||
### 5. Admin Panel URL
|
||||
|
||||
```bash
|
||||
dokku config:set casera-api \
|
||||
NEXT_PUBLIC_API_URL=https://api.casera.treytartt.com
|
||||
dokku config:set honeydue-api \
|
||||
NEXT_PUBLIC_API_URL=https://api.honeyDue.treytartt.com
|
||||
```
|
||||
|
||||
### 6. View All Configuration
|
||||
|
||||
```bash
|
||||
dokku config:show casera-api
|
||||
dokku config:show honeydue-api
|
||||
```
|
||||
|
||||
---
|
||||
@@ -266,16 +266,16 @@ dokku config:show casera-api
|
||||
|
||||
```bash
|
||||
# Create storage directory on host
|
||||
mkdir -p /var/lib/dokku/data/storage/casera-api/uploads
|
||||
mkdir -p /var/lib/dokku/data/storage/honeydue-api/uploads
|
||||
|
||||
# Set permissions
|
||||
chown -R 32767:32767 /var/lib/dokku/data/storage/casera-api
|
||||
chown -R 32767:32767 /var/lib/dokku/data/storage/honeydue-api
|
||||
```
|
||||
|
||||
### 2. Mount Storage to App
|
||||
|
||||
```bash
|
||||
dokku storage:mount casera-api /var/lib/dokku/data/storage/casera-api/uploads:/app/uploads
|
||||
dokku storage:mount honeydue-api /var/lib/dokku/data/storage/honeydue-api/uploads:/app/uploads
|
||||
```
|
||||
|
||||
---
|
||||
@@ -285,8 +285,8 @@ dokku storage:mount casera-api /var/lib/dokku/data/storage/casera-api/uploads:/a
|
||||
### 1. Add Dokku Remote (Local Machine)
|
||||
|
||||
```bash
|
||||
cd /path/to/myCribAPI-go
|
||||
git remote add dokku dokku@your-server-ip:casera-api
|
||||
cd /path/to/honeyDueAPI-go
|
||||
git remote add dokku dokku@your-server-ip:honeydue-api
|
||||
```
|
||||
|
||||
### 2. Deploy
|
||||
@@ -301,17 +301,17 @@ git push dokku main
|
||||
|
||||
```bash
|
||||
# On server
|
||||
dokku logs casera-api -t
|
||||
dokku logs honeydue-api -t
|
||||
```
|
||||
|
||||
### 4. Verify Deployment
|
||||
|
||||
```bash
|
||||
# Check app status
|
||||
dokku ps:report casera-api
|
||||
dokku ps:report honeydue-api
|
||||
|
||||
# Check app is running
|
||||
curl https://api.casera.treytartt.com/api/health/
|
||||
curl https://api.honeyDue.treytartt.com/api/health/
|
||||
```
|
||||
|
||||
---
|
||||
@@ -321,13 +321,13 @@ curl https://api.casera.treytartt.com/api/health/
|
||||
### 1. Set Let's Encrypt Email
|
||||
|
||||
```bash
|
||||
dokku letsencrypt:set casera-api email admin@treytartt.com
|
||||
dokku letsencrypt:set honeydue-api email admin@treytartt.com
|
||||
```
|
||||
|
||||
### 2. Enable Let's Encrypt
|
||||
|
||||
```bash
|
||||
dokku letsencrypt:enable casera-api
|
||||
dokku letsencrypt:enable honeydue-api
|
||||
```
|
||||
|
||||
### 3. Set Up Auto-Renewal
|
||||
@@ -345,7 +345,7 @@ The worker process handles background jobs (task reminders, overdue alerts, dail
|
||||
### 1. Configure Worker Environment Variables
|
||||
|
||||
```bash
|
||||
dokku config:set casera-api \
|
||||
dokku config:set honeydue-api \
|
||||
TASK_REMINDER_HOUR=20 \
|
||||
TASK_REMINDER_MINUTE=0 \
|
||||
OVERDUE_REMINDER_HOUR=9 \
|
||||
@@ -364,17 +364,17 @@ dokku config:set casera-api \
|
||||
|
||||
```bash
|
||||
# Scale to 1 worker
|
||||
dokku ps:scale casera-api worker=1
|
||||
dokku ps:scale honeydue-api worker=1
|
||||
|
||||
# Verify processes
|
||||
dokku ps:report casera-api
|
||||
dokku ps:report honeydue-api
|
||||
```
|
||||
|
||||
### 3. Verify Worker is Running
|
||||
|
||||
```bash
|
||||
# Check worker logs
|
||||
dokku logs casera-api -p worker
|
||||
dokku logs honeydue-api -p worker
|
||||
|
||||
# Should see:
|
||||
# "Registered task reminder job"
|
||||
@@ -391,33 +391,33 @@ dokku logs casera-api -p worker
|
||||
|
||||
```bash
|
||||
# Real-time logs
|
||||
dokku logs casera-api -t
|
||||
dokku logs honeydue-api -t
|
||||
|
||||
# Last 100 lines
|
||||
dokku logs casera-api -n 100
|
||||
dokku logs honeydue-api -n 100
|
||||
|
||||
# Worker logs
|
||||
dokku logs casera-api -p worker
|
||||
dokku logs honeydue-api -p worker
|
||||
```
|
||||
|
||||
### Database Operations
|
||||
|
||||
```bash
|
||||
# Connect to database
|
||||
dokku postgres:connect casera-db
|
||||
dokku postgres:connect honeydue-db
|
||||
|
||||
# Export database backup
|
||||
dokku postgres:export casera-db > backup.sql
|
||||
dokku postgres:export honeydue-db > backup.sql
|
||||
|
||||
# Import database backup
|
||||
dokku postgres:import casera-db < backup.sql
|
||||
dokku postgres:import honeydue-db < backup.sql
|
||||
```
|
||||
|
||||
### Run Migrations Manually
|
||||
|
||||
```bash
|
||||
# Enter the app container
|
||||
dokku enter casera-api web
|
||||
dokku enter honeydue-api web
|
||||
|
||||
# Migrations run automatically on startup, but if needed:
|
||||
/app/api migrate
|
||||
@@ -426,24 +426,24 @@ dokku enter casera-api web
|
||||
### Restart App
|
||||
|
||||
```bash
|
||||
dokku ps:restart casera-api
|
||||
dokku ps:restart honeydue-api
|
||||
```
|
||||
|
||||
### Scale App
|
||||
|
||||
```bash
|
||||
# Scale web process
|
||||
dokku ps:scale casera-api web=2 worker=1
|
||||
dokku ps:scale honeydue-api web=2 worker=1
|
||||
|
||||
# View current scale
|
||||
dokku ps:report casera-api
|
||||
dokku ps:report honeydue-api
|
||||
```
|
||||
|
||||
### Stop/Start App
|
||||
|
||||
```bash
|
||||
dokku ps:stop casera-api
|
||||
dokku ps:start casera-api
|
||||
dokku ps:stop honeydue-api
|
||||
dokku ps:start honeydue-api
|
||||
```
|
||||
|
||||
---
|
||||
@@ -453,8 +453,8 @@ dokku ps:start casera-api
|
||||
### Check App Status
|
||||
|
||||
```bash
|
||||
dokku ps:report casera-api
|
||||
dokku logs casera-api -n 200
|
||||
dokku ps:report honeydue-api
|
||||
dokku logs honeydue-api -n 200
|
||||
```
|
||||
|
||||
### Common Issues
|
||||
@@ -463,47 +463,47 @@ dokku logs casera-api -n 200
|
||||
|
||||
```bash
|
||||
# Check logs for errors
|
||||
dokku logs casera-api -n 500
|
||||
dokku logs honeydue-api -n 500
|
||||
|
||||
# Verify environment variables
|
||||
dokku config:show casera-api
|
||||
dokku config:show honeydue-api
|
||||
|
||||
# Check if ports are available
|
||||
dokku proxy:ports casera-api
|
||||
dokku proxy:ports honeydue-api
|
||||
```
|
||||
|
||||
#### 2. Database Connection Failed
|
||||
|
||||
```bash
|
||||
# Verify link
|
||||
dokku postgres:linked casera-api casera-db
|
||||
dokku postgres:linked honeydue-api honeydue-db
|
||||
|
||||
# Check database is running
|
||||
dokku postgres:info casera-db
|
||||
dokku postgres:info honeydue-db
|
||||
|
||||
# Re-link if needed
|
||||
dokku postgres:unlink casera-db casera-api
|
||||
dokku postgres:link casera-db casera-api
|
||||
dokku postgres:unlink honeydue-db honeydue-api
|
||||
dokku postgres:link honeydue-db honeydue-api
|
||||
```
|
||||
|
||||
#### 3. Redis Connection Failed
|
||||
|
||||
```bash
|
||||
# Verify link
|
||||
dokku redis:linked casera-api casera-redis
|
||||
dokku redis:linked honeydue-api honeydue-redis
|
||||
|
||||
# Check Redis is running
|
||||
dokku redis:info casera-redis
|
||||
dokku redis:info honeydue-redis
|
||||
```
|
||||
|
||||
#### 4. Storage/Upload Issues
|
||||
|
||||
```bash
|
||||
# Check mounts
|
||||
dokku storage:report casera-api
|
||||
dokku storage:report honeydue-api
|
||||
|
||||
# Verify permissions
|
||||
ls -la /var/lib/dokku/data/storage/casera-api/
|
||||
ls -la /var/lib/dokku/data/storage/honeydue-api/
|
||||
```
|
||||
|
||||
#### 5. SSL Certificate Issues
|
||||
@@ -513,7 +513,7 @@ ls -la /var/lib/dokku/data/storage/casera-api/
|
||||
dokku letsencrypt:list
|
||||
|
||||
# Renew manually
|
||||
dokku letsencrypt:enable casera-api
|
||||
dokku letsencrypt:enable honeydue-api
|
||||
```
|
||||
|
||||
### View Resource Usage
|
||||
@@ -523,7 +523,7 @@ dokku letsencrypt:enable casera-api
|
||||
docker stats
|
||||
|
||||
# Disk usage
|
||||
dokku storage:report casera-api
|
||||
dokku storage:report honeydue-api
|
||||
df -h
|
||||
```
|
||||
|
||||
@@ -534,12 +534,12 @@ df -h
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `dokku apps:list` | List all apps |
|
||||
| `dokku logs casera-api -t` | Tail logs |
|
||||
| `dokku ps:restart casera-api` | Restart app |
|
||||
| `dokku config:show casera-api` | Show env vars |
|
||||
| `dokku postgres:connect casera-db` | Connect to DB |
|
||||
| `dokku enter casera-api web` | Shell into container |
|
||||
| `dokku ps:scale casera-api web=2` | Scale processes |
|
||||
| `dokku logs honeydue-api -t` | Tail logs |
|
||||
| `dokku ps:restart honeydue-api` | Restart app |
|
||||
| `dokku config:show honeydue-api` | Show env vars |
|
||||
| `dokku postgres:connect honeydue-db` | Connect to DB |
|
||||
| `dokku enter honeydue-api web` | Shell into container |
|
||||
| `dokku ps:scale honeydue-api web=2` | Scale processes |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Go To Prod Plan
|
||||
|
||||
This document is a phased production-readiness plan for the Casera Go API repo.
|
||||
This document is a phased production-readiness plan for the honeyDue Go API repo.
|
||||
Execute phases in order. Do not skip exit criteria.
|
||||
|
||||
## How To Use This Plan
|
||||
@@ -15,12 +15,12 @@ Goal: eliminate known repo/config drift before hardening.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. Fix stale admin build/run targets in [`Makefile`](/Users/treyt/Desktop/code/MyCribAPI_GO/Makefile) that reference `cmd/admin` (non-existent).
|
||||
2. Align worker env vars in [`docker-compose.yml`](/Users/treyt/Desktop/code/MyCribAPI_GO/docker-compose.yml) with Go config:
|
||||
1. Fix stale admin build/run targets in [`Makefile`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/Makefile) that reference `cmd/admin` (non-existent).
|
||||
2. Align worker env vars in [`docker-compose.yml`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/docker-compose.yml) with Go config:
|
||||
- use `TASK_REMINDER_HOUR`
|
||||
- use `OVERDUE_REMINDER_HOUR`
|
||||
- use `DAILY_DIGEST_HOUR`
|
||||
3. Align supported locales in [`internal/i18n/i18n.go`](/Users/treyt/Desktop/code/MyCribAPI_GO/internal/i18n/i18n.go) with translation files in [`internal/i18n/translations`](/Users/treyt/Desktop/code/MyCribAPI_GO/internal/i18n/translations).
|
||||
3. Align supported locales in [`internal/i18n/i18n.go`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/internal/i18n/i18n.go) with translation files in [`internal/i18n/translations`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/internal/i18n/translations).
|
||||
4. Remove any committed secrets/keys from repo and history; rotate immediately.
|
||||
|
||||
### Validation
|
||||
@@ -42,7 +42,7 @@ Goal: block regressions by policy.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. Update [`/.github/workflows/backend-ci.yml`](/Users/treyt/Desktop/code/MyCribAPI_GO/.github/workflows/backend-ci.yml) with required jobs:
|
||||
1. Update [`/.github/workflows/backend-ci.yml`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/.github/workflows/backend-ci.yml) with required jobs:
|
||||
- `lint` (`go vet ./...`, `gofmt -l .`)
|
||||
- `test` (`go test -race -count=1 ./...`)
|
||||
- `contract` (`go test -v -run "TestRouteSpecContract|TestKMPSpecContract" ./internal/integration/`)
|
||||
@@ -72,7 +72,7 @@ Goal: guarantee deploy safety for API behavior and schema changes.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. Keep OpenAPI as source of truth in [`docs/openapi.yaml`](/Users/treyt/Desktop/code/MyCribAPI_GO/docs/openapi.yaml).
|
||||
1. Keep OpenAPI as source of truth in [`docs/openapi.yaml`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/docs/openapi.yaml).
|
||||
2. Require route/schema updates in same PR as handler changes.
|
||||
3. Add migration checks in CI:
|
||||
- migrate up on clean DB
|
||||
@@ -166,7 +166,7 @@ Goal: make production behavior measurable and actionable.
|
||||
- queue depth/retry spikes
|
||||
- DB latency
|
||||
4. Add dead-letter queue review and replay procedure.
|
||||
5. Document incident runbooks in [`docs/`](/Users/treyt/Desktop/code/MyCribAPI_GO/docs):
|
||||
5. Document incident runbooks in [`docs/`](/Users/treyt/Desktop/code/HoneyDueAPI_GO/docs):
|
||||
- DB outage
|
||||
- Redis outage
|
||||
- push provider outage
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Full Localization Plan for Casera
|
||||
# Full Localization Plan for honeyDue
|
||||
|
||||
## Overview
|
||||
|
||||
Complete localization of the Casera property management app across three codebases:
|
||||
Complete localization of the honeyDue property management app across three codebases:
|
||||
- **Go API** - Server-side localization of errors, emails, push notifications, lookup data
|
||||
- **KMM/Android** - Compose Multiplatform string resources
|
||||
- **iOS** - Apple String Catalogs (.xcstrings)
|
||||
@@ -28,7 +28,7 @@ go get github.com/nicksnyder/go-i18n/v2
|
||||
### 1.2 Directory Structure
|
||||
|
||||
```
|
||||
myCribAPI-go/
|
||||
honeyDueAPI-go/
|
||||
├── internal/
|
||||
│ └── i18n/
|
||||
│ ├── i18n.go # Core setup, bundle, T() helper
|
||||
@@ -139,7 +139,7 @@ Use Compose Multiplatform Resources (already in build.gradle.kts via `compose.co
|
||||
### 2.2 Directory Structure
|
||||
|
||||
```
|
||||
MyCribKMM/composeApp/src/commonMain/
|
||||
HoneyDueKMM/composeApp/src/commonMain/
|
||||
└── composeResources/
|
||||
├── values/
|
||||
│ └── strings.xml # English (base)
|
||||
@@ -195,8 +195,8 @@ MyCribKMM/composeApp/src/commonMain/
|
||||
### 2.4 Usage in Compose
|
||||
|
||||
```kotlin
|
||||
import casera.composeapp.generated.resources.Res
|
||||
import casera.composeapp.generated.resources.*
|
||||
import honeydue.composeapp.generated.resources.Res
|
||||
import honeydue.composeapp.generated.resources.*
|
||||
import org.jetbrains.compose.resources.stringResource
|
||||
|
||||
@Composable
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# Push Notifications Architecture
|
||||
|
||||
This document describes how push notifications work in the Casera API.
|
||||
This document describes how push notifications work in the honeyDue API.
|
||||
|
||||
## Overview
|
||||
|
||||
The Casera API sends push notifications directly to Apple Push Notification service (APNs) and Firebase Cloud Messaging (FCM) without any intermediate push server. This approach:
|
||||
The honeyDue API sends push notifications directly to Apple Push Notification service (APNs) and Firebase Cloud Messaging (FCM) without any intermediate push server. This approach:
|
||||
|
||||
- Reduces infrastructure complexity (no Gorush or other push server needed)
|
||||
- Provides direct control over notification payloads
|
||||
@@ -14,7 +14,7 @@ The Casera API sends push notifications directly to Apple Push Notification serv
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ Casera API │
|
||||
│ honeyDue API │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌──────────────┐ ┌─────────────────────┐ ┌───────────────────┐ │
|
||||
@@ -153,7 +153,7 @@ let taskCategory = UNNotificationCategory(
|
||||
| `APNS_AUTH_KEY_PATH` | For iOS | Path to .p8 key file |
|
||||
| `APNS_AUTH_KEY_ID` | For iOS | Key ID from Apple Developer |
|
||||
| `APNS_TEAM_ID` | For iOS | Team ID from Apple Developer |
|
||||
| `APNS_TOPIC` | For iOS | Bundle ID (e.g., `com.tt.casera.CaseraDev`) |
|
||||
| `APNS_TOPIC` | For iOS | Bundle ID (e.g., `com.tt.honeyDue.honeyDueDev`) |
|
||||
| `APNS_PRODUCTION` | No | `true` for production, `false` for sandbox |
|
||||
| `APNS_USE_SANDBOX` | No | Deprecated, use `APNS_PRODUCTION` |
|
||||
| `FCM_SERVER_KEY` | For Android | Firebase Cloud Messaging server key |
|
||||
@@ -168,7 +168,7 @@ volumes:
|
||||
- ./push_certs:/certs:ro
|
||||
|
||||
# Dokku
|
||||
dokku storage:mount casera-api /path/to/push_certs:/certs
|
||||
dokku storage:mount honeydue-api /path/to/push_certs:/certs
|
||||
```
|
||||
|
||||
## Data Flow
|
||||
@@ -263,7 +263,7 @@ log.Info().
|
||||
docker-compose logs -f worker
|
||||
|
||||
# Dokku
|
||||
dokku logs casera-api -p worker
|
||||
dokku logs honeydue-api -p worker
|
||||
```
|
||||
|
||||
### Test Push Manually
|
||||
|
||||
@@ -192,7 +192,7 @@ suspend fun fetchMedia(mediaUrl: String): ByteArray {
|
||||
|
||||
## Files to Modify
|
||||
|
||||
### Go API (myCribAPI-go)
|
||||
### Go API (honeyDueAPI-go)
|
||||
|
||||
| File | Change |
|
||||
|------|--------|
|
||||
@@ -203,7 +203,7 @@ suspend fun fetchMedia(mediaUrl: String): ByteArray {
|
||||
| `/internal/services/document_service.go` | Update to generate proxy URLs |
|
||||
| `/internal/services/task_service.go` | Update to generate proxy URLs for completions |
|
||||
|
||||
### iOS (MyCribKMM/iosApp)
|
||||
### iOS (HoneyDueKMM/iosApp)
|
||||
|
||||
| File | Change |
|
||||
|------|--------|
|
||||
|
||||
@@ -48,7 +48,7 @@ To enable server-side receipt validation:
|
||||
|
||||
1. Go to [App Store Connect > Users and Access > Keys](https://appstoreconnect.apple.com/access/api)
|
||||
2. Click **Generate API Key**
|
||||
3. Give it a name (e.g., "Casera IAP Server")
|
||||
3. Give it a name (e.g., "honeyDue IAP Server")
|
||||
4. Select **App Manager** role (minimum required for IAP)
|
||||
5. Download the `.p8` file - **you can only download it once!**
|
||||
6. Note the **Key ID** and **Issuer ID**
|
||||
@@ -80,15 +80,15 @@ Google uses Cloud Pub/Sub to deliver subscription notifications. Setup requires
|
||||
2. Select your project (or create one)
|
||||
3. Navigate to **Pub/Sub** > **Topics**
|
||||
4. Click **Create Topic**
|
||||
5. Name it (e.g., `casera-subscriptions`)
|
||||
6. Note the full topic name: `projects/your-project-id/topics/casera-subscriptions`
|
||||
5. Name it (e.g., `honeydue-subscriptions`)
|
||||
6. Note the full topic name: `projects/your-project-id/topics/honeydue-subscriptions`
|
||||
|
||||
### 2. Create a Push Subscription
|
||||
|
||||
1. In the Pub/Sub Topics list, click on your topic
|
||||
2. Click **Create Subscription**
|
||||
3. Configure:
|
||||
- **Subscription ID**: `casera-subscription-webhook`
|
||||
- **Subscription ID**: `honeydue-subscription-webhook`
|
||||
- **Delivery type**: Push
|
||||
- **Endpoint URL**: `https://your-domain.com/api/subscription/webhook/google/`
|
||||
- **Acknowledgment deadline**: 60 seconds
|
||||
@@ -100,7 +100,7 @@ Google uses Cloud Pub/Sub to deliver subscription notifications. Setup requires
|
||||
2. Select your app
|
||||
3. Navigate to **Monetization** > **Monetization setup**
|
||||
4. Under **Real-time developer notifications**:
|
||||
- Enter your topic name: `projects/your-project-id/topics/casera-subscriptions`
|
||||
- Enter your topic name: `projects/your-project-id/topics/honeydue-subscriptions`
|
||||
5. Click **Save**
|
||||
6. Click **Send test notification** to verify the connection
|
||||
|
||||
@@ -108,7 +108,7 @@ Google uses Cloud Pub/Sub to deliver subscription notifications. Setup requires
|
||||
|
||||
1. Go to [Google Cloud Console > IAM & Admin > Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts)
|
||||
2. Click **Create Service Account**
|
||||
3. Name it (e.g., `casera-iap-validator`)
|
||||
3. Name it (e.g., `honeydue-iap-validator`)
|
||||
4. Grant roles:
|
||||
- `Pub/Sub Subscriber` (for webhook handling)
|
||||
5. Click **Done**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Task Kanban Categorization
|
||||
|
||||
This document explains how tasks are categorized into kanban columns in the Casera application.
|
||||
This document explains how tasks are categorized into kanban columns in the honeyDue application.
|
||||
|
||||
> Note: The categorization chain still computes `cancelled_tasks`, but the kanban board response
|
||||
> intentionally hides cancelled/archived tasks and returns only 5 visible columns.
|
||||
@@ -245,7 +245,7 @@ Each column has associated metadata for UI rendering:
|
||||
### Basic Categorization
|
||||
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/task/categorization"
|
||||
import "github.com/treytartt/honeydue-api/internal/task/categorization"
|
||||
|
||||
task := &models.Task{
|
||||
DueDate: time.Now().AddDate(0, 0, 15), // 15 days from now
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Task Kanban Board Categorization Logic
|
||||
|
||||
This document describes how tasks are categorized into kanban columns for display in the Casera mobile app.
|
||||
This document describes how tasks are categorized into kanban columns for display in the honeyDue mobile app.
|
||||
|
||||
> Important: The board intentionally returns **5 visible columns**. Cancelled and archived tasks are
|
||||
> hidden from board responses (though task-level `kanban_column` may still be `cancelled_tasks`).
|
||||
|
||||
@@ -22,7 +22,7 @@ internal/task/
|
||||
Pure Go functions that define task logic. These are the **canonical definitions** for all task states.
|
||||
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/task/predicates"
|
||||
import "github.com/treytartt/honeydue-api/internal/task/predicates"
|
||||
|
||||
// State checks
|
||||
predicates.IsCompleted(task) // NextDueDate == nil && len(Completions) > 0
|
||||
@@ -43,7 +43,7 @@ predicates.IsUpcoming(task, now, days) // Everything else
|
||||
GORM scope functions that produce the same results as predicates, but execute at the database level. Use these when counting or filtering large datasets without loading all records into memory.
|
||||
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/task/scopes"
|
||||
import "github.com/treytartt/honeydue-api/internal/task/scopes"
|
||||
|
||||
// State scopes
|
||||
db.Scopes(scopes.ScopeActive) // is_cancelled = false AND is_archived = false
|
||||
@@ -69,7 +69,7 @@ db.Scopes(scopes.ScopeKanbanOrder) // Due date ASC, priority DESC, cr
|
||||
Determines which kanban column a task belongs to. Uses predicates internally.
|
||||
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/task/categorization"
|
||||
import "github.com/treytartt/honeydue-api/internal/task/categorization"
|
||||
|
||||
// Single task
|
||||
column := categorization.CategorizeTask(task, 30)
|
||||
@@ -85,7 +85,7 @@ columns := categorization.CategorizeTasksIntoColumns(tasks, 30)
|
||||
For most use cases, import the main task package which re-exports everything:
|
||||
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/task"
|
||||
import "github.com/treytartt/honeydue-api/internal/task"
|
||||
|
||||
// Use predicates
|
||||
if task.IsCompleted(t) { ... }
|
||||
@@ -344,7 +344,7 @@ predicates.IsInProgress(task) // Checks task.InProgress boolean
|
||||
For most files, use the convenience re-exports:
|
||||
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/task"
|
||||
import "github.com/treytartt/honeydue-api/internal/task"
|
||||
|
||||
// Then use:
|
||||
task.IsCompleted(t)
|
||||
@@ -355,8 +355,8 @@ task.CategorizeTask(t, 30)
|
||||
For files that only need predicates or only need scopes:
|
||||
|
||||
```go
|
||||
import "github.com/treytartt/casera-api/internal/task/predicates"
|
||||
import "github.com/treytartt/casera-api/internal/task/scopes"
|
||||
import "github.com/treytartt/honeydue-api/internal/task/predicates"
|
||||
import "github.com/treytartt/honeydue-api/internal/task/scopes"
|
||||
```
|
||||
|
||||
## Related Documentation
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
*Last Updated: December 2024*
|
||||
|
||||
This document provides a comprehensive comparison of home management apps similar to Casera/MyCrib.
|
||||
This document provides a comprehensive comparison of home management apps similar to honeyDue/HoneyDue.
|
||||
|
||||
---
|
||||
|
||||
@@ -10,7 +10,7 @@ This document provides a comprehensive comparison of home management apps simila
|
||||
|
||||
| App | Task Scheduling | Multi-Property | Document Storage | Contractors | Warranty Tracking | Pricing |
|
||||
|-----|----------------|----------------|------------------|-------------|-------------------|---------|
|
||||
| **Casera (MyCrib)** | Recurring + Kanban | Yes | Yes | Yes | Yes | TBD |
|
||||
| **honeyDue** | Recurring + Kanban | Yes | Yes | Yes | Yes | TBD |
|
||||
| **HomeZada** | Yes | Yes (Deluxe) | Yes | No | Yes | Free / $59-99/yr |
|
||||
| **Centriq** | Reminders only | Yes | Yes (Manuals) | No | Yes + Recalls | Free / $18-100/yr |
|
||||
| **Homer** | Yes | Yes | Yes | Contacts only | Yes | Free / Premium |
|
||||
@@ -187,9 +187,9 @@ This document provides a comprehensive comparison of home management apps simila
|
||||
|
||||
## Competitive Positioning
|
||||
|
||||
### Where Casera Differentiates
|
||||
### Where honeyDue Differentiates
|
||||
|
||||
Based on competitor analysis, Casera has unique advantages:
|
||||
Based on competitor analysis, honeyDue has unique advantages:
|
||||
|
||||
1. **Contractor Management** - Most competitors lack this entirely
|
||||
2. **Kanban Task View** - Unique visual organization (overdue, due soon, upcoming, completed)
|
||||
@@ -197,9 +197,9 @@ Based on competitor analysis, Casera has unique advantages:
|
||||
4. **Combined Approach** - Tasks + Documents + Contractors + Warranties in one app
|
||||
5. **Recurring Task Intelligence** - Smart next-due-date calculation for recurring maintenance
|
||||
|
||||
### Competitor Gaps Casera Fills
|
||||
### Competitor Gaps honeyDue Fills
|
||||
|
||||
| Gap | Competitors Missing It | Casera Solution |
|
||||
| Gap | Competitors Missing It | honeyDue Solution |
|
||||
|-----|------------------------|-----------------|
|
||||
| Contractor database | All except Homer (contacts only) | Full contractor profiles with specialties |
|
||||
| Kanban visualization | All | Visual task board with columns |
|
||||
@@ -229,12 +229,12 @@ Based on market analysis:
|
||||
|
||||
### Competitive Price Points
|
||||
|
||||
| Competitor | Annual Price | Casera Comparison |
|
||||
| Competitor | Annual Price | honeyDue Comparison |
|
||||
|------------|--------------|-------------------|
|
||||
| Tody | $6 | Casera offers much more (not just cleaning) |
|
||||
| Sweepy | $15-17 | Casera offers full home management |
|
||||
| Centriq | $18-100 | Casera has better task management |
|
||||
| HomeZada | $59-149 | Casera adds contractors, better UX |
|
||||
| Tody | $6 | honeyDue offers much more (not just cleaning) |
|
||||
| Sweepy | $15-17 | honeyDue offers full home management |
|
||||
| Centriq | $18-100 | honeyDue has better task management |
|
||||
| HomeZada | $59-149 | honeyDue adds contractors, better UX |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -11,28 +11,28 @@
|
||||
|
||||
---
|
||||
|
||||
# Casera Launches to Help Homeowners Take Control of Home Maintenance
|
||||
# honeyDue Launches to Help Homeowners Take Control of Home Maintenance
|
||||
|
||||
*New mobile app brings task management, document storage, and contractor organization to homeowners tired of forgotten maintenance and lost warranties*
|
||||
|
||||
---
|
||||
|
||||
**[CITY, STATE] — [DATE]** — Casera, a new home maintenance management app, launched today on iOS and Android, offering homeowners a simple yet powerful way to organize every aspect of home upkeep. The app combines recurring task scheduling, document storage, contractor management, and household collaboration in one intuitive platform.
|
||||
**[CITY, STATE] — [DATE]** — honeyDue, a new home maintenance management app, launched today on iOS and Android, offering homeowners a simple yet powerful way to organize every aspect of home upkeep. The app combines recurring task scheduling, document storage, contractor management, and household collaboration in one intuitive platform.
|
||||
|
||||
"Homeownership comes with a hidden job: maintenance manager," said [Founder Name], founder of Casera. "Most people cobble together sticky notes, spreadsheet reminders, and hope. We built Casera because there had to be a better way."
|
||||
"Homeownership comes with a hidden job: maintenance manager," said [Founder Name], founder of honeyDue. "Most people cobble together sticky notes, spreadsheet reminders, and hope. We built honeyDue because there had to be a better way."
|
||||
|
||||
### The Problem Casera Solves
|
||||
### The Problem honeyDue Solves
|
||||
|
||||
The average single-family home requires maintenance on over 40 different systems and components, from HVAC filters to roof inspections. According to HomeAdvisor, homeowners spend an average of $3,192 annually on emergency repairs — many of which could be prevented with regular maintenance.
|
||||
|
||||
Yet most homeowners lack any organized system to track these tasks. Warranties get lost in email. Contractor contact information lives in scattered text threads. Important maintenance gets forgotten until something breaks.
|
||||
|
||||
### How Casera Works
|
||||
### How honeyDue Works
|
||||
|
||||
Casera provides homeowners with four core capabilities:
|
||||
honeyDue provides homeowners with four core capabilities:
|
||||
|
||||
**Smart Task Scheduling**
|
||||
Users can create one-time or recurring maintenance tasks with customizable frequencies — from daily to annually. The app's kanban-style board shows tasks organized by urgency: overdue, due soon, upcoming, and completed. When a recurring task is completed, Casera automatically schedules the next occurrence.
|
||||
Users can create one-time or recurring maintenance tasks with customizable frequencies — from daily to annually. The app's kanban-style board shows tasks organized by urgency: overdue, due soon, upcoming, and completed. When a recurring task is completed, honeyDue automatically schedules the next occurrence.
|
||||
|
||||
**Document Storage**
|
||||
Warranties, manuals, receipts, and home documents can be uploaded and organized by room or category. When an appliance needs service, the warranty information is instantly accessible.
|
||||
@@ -51,13 +51,13 @@ The home services market is projected to reach $1.2 trillion by 2026, driven by
|
||||
|
||||
### Pricing and Availability
|
||||
|
||||
Casera is available now as a free download on the [App Store](link) and [Google Play](link). The free tier includes core functionality for one property. Premium tiers offering multiple properties, unlimited document storage, and priority support are available starting at $[X]/month.
|
||||
honeyDue is available now as a free download on the [App Store](link) and [Google Play](link). The free tier includes core functionality for one property. Premium tiers offering multiple properties, unlimited document storage, and priority support are available starting at $[X]/month.
|
||||
|
||||
### About Casera
|
||||
### About honeyDue
|
||||
|
||||
Casera is a home maintenance management platform designed to help homeowners stay ahead of maintenance, protect their investment, and reduce the stress of property upkeep. Founded in [YEAR], Casera is headquartered in [CITY, STATE].
|
||||
honeyDue is a home maintenance management platform designed to help homeowners stay ahead of maintenance, protect their investment, and reduce the stress of property upkeep. Founded in [YEAR], honeyDue is headquartered in [CITY, STATE].
|
||||
|
||||
For more information, visit [www.casera.app](https://www.casera.app) or follow @CaseraApp on [Twitter](link) and [Instagram](link).
|
||||
For more information, visit [www.honeyDue.treytartt.com](https://www.honeyDue.treytartt.com) or follow @honeyDueApp on [Twitter](link) and [Instagram](link).
|
||||
|
||||
---
|
||||
|
||||
@@ -76,7 +76,7 @@ High-resolution logos, app screenshots, and founder headshots are available at:
|
||||
| **Price** | Free with premium tiers |
|
||||
| **Headquarters** | [CITY, STATE] |
|
||||
| **Website** | [URL] |
|
||||
| **Social** | @CaseraApp |
|
||||
| **Social** | @honeyDueApp |
|
||||
|
||||
---
|
||||
|
||||
@@ -94,7 +94,7 @@ High-resolution logos, app screenshots, and founder headshots are available at:
|
||||
|
||||
Hi [Name],
|
||||
|
||||
Quick pitch: Casera is a new app that helps homeowners track recurring maintenance, store warranties, and organize contractor info — all in one place.
|
||||
Quick pitch: honeyDue is a new app that helps homeowners track recurring maintenance, store warranties, and organize contractor info — all in one place.
|
||||
|
||||
**The hook:** The average homeowner spends $3,000+/year on emergency repairs. Most are preventable with basic maintenance. But there's been no good system to track it all — until now.
|
||||
|
||||
@@ -115,7 +115,7 @@ Best,
|
||||
## Tweet-Length Announcement
|
||||
|
||||
```
|
||||
📱 Casera just launched — the home maintenance app for homeowners who are tired of forgetting filter changes and losing warranties.
|
||||
📱 honeyDue just launched — the home maintenance app for homeowners who are tired of forgetting filter changes and losing warranties.
|
||||
|
||||
Free on iOS + Android.
|
||||
|
||||
@@ -129,10 +129,10 @@ Your home runs better when you do. 🏠
|
||||
*Choose the one that fits your story best:*
|
||||
|
||||
**Problem-focused:**
|
||||
> "I built Casera after my AC died because I forgot a $150 tune-up. That $4,000 lesson convinced me there had to be a better way to manage home maintenance."
|
||||
> "I built honeyDue after my AC died because I forgot a $150 tune-up. That $4,000 lesson convinced me there had to be a better way to manage home maintenance."
|
||||
|
||||
**Vision-focused:**
|
||||
> "We believe your home deserves the same organizational tools as your work calendar. Casera brings that professionalism to home management."
|
||||
> "We believe your home deserves the same organizational tools as your work calendar. honeyDue brings that professionalism to home management."
|
||||
|
||||
**Market-focused:**
|
||||
> "Smart home technology has focused on automation and convenience. We're focused on something simpler: helping people remember to take care of their biggest investment."
|
||||
@@ -168,21 +168,21 @@ Journalists can approach this story from multiple angles:
|
||||
1. What's the most commonly forgotten home maintenance task?
|
||||
2. How much can preventive maintenance actually save homeowners?
|
||||
3. Why hasn't this problem been solved before?
|
||||
4. How is Casera different from calendar reminders?
|
||||
4. How is honeyDue different from calendar reminders?
|
||||
5. What's the most surprising thing you've learned from users?
|
||||
|
||||
---
|
||||
|
||||
## Boilerplate
|
||||
|
||||
**About Casera (50 words)**
|
||||
Casera is a home maintenance management app that helps homeowners track recurring tasks, store important documents, organize contractor information, and collaborate with household members. Available on iOS and Android, Casera brings clarity and organization to the often-overwhelming job of home upkeep.
|
||||
**About honeyDue (50 words)**
|
||||
honeyDue is a home maintenance management app that helps homeowners track recurring tasks, store important documents, organize contractor information, and collaborate with household members. Available on iOS and Android, honeyDue brings clarity and organization to the often-overwhelming job of home upkeep.
|
||||
|
||||
**About Casera (25 words)**
|
||||
Casera is a home maintenance app that helps homeowners track tasks, store warranties, and organize contractor info — all in one place.
|
||||
**About honeyDue (25 words)**
|
||||
honeyDue is a home maintenance app that helps homeowners track tasks, store warranties, and organize contractor info — all in one place.
|
||||
|
||||
**About Casera (10 words)**
|
||||
Casera: The organized way to manage home maintenance.
|
||||
**About honeyDue (10 words)**
|
||||
honeyDue: The organized way to manage home maintenance.
|
||||
|
||||
---
|
||||
|
||||
@@ -195,6 +195,6 @@ Casera: The organized way to manage home maintenance.
|
||||
|
||||
**General Information:**
|
||||
Website: [URL]
|
||||
Email: hello@casera.app
|
||||
Twitter: @CaseraApp
|
||||
Instagram: @CaseraApp
|
||||
Email: hello@honeyDue.treytartt.com
|
||||
Twitter: @honeyDueApp
|
||||
Instagram: @honeyDueApp
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Casera Social Media Kit
|
||||
# honeyDue Social Media Kit
|
||||
|
||||
*Ready-to-use posts for launching and promoting Casera*
|
||||
*Ready-to-use posts for launching and promoting honeyDue*
|
||||
|
||||
---
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
**Post 1 - Main Launch**
|
||||
```
|
||||
Introducing Casera 🏠
|
||||
Introducing honeyDue 🏠
|
||||
|
||||
The home maintenance app that actually makes sense.
|
||||
|
||||
@@ -41,7 +41,7 @@ Download free → [link]
|
||||
```
|
||||
That "I should really check the HVAC filter" thought you have every 3 months?
|
||||
|
||||
Casera remembers it for you.
|
||||
honeyDue remembers it for you.
|
||||
|
||||
Set it once. Get reminded forever.
|
||||
|
||||
@@ -56,7 +56,7 @@ POV: You need a plumber at 9pm
|
||||
❌ Googling "plumber near me" again
|
||||
❌ Hoping you saved that business card
|
||||
|
||||
✅ Opening Casera and finding Mike the Plumber instantly
|
||||
✅ Opening honeyDue and finding Mike the Plumber instantly
|
||||
|
||||
Your contractor rolodex, always in your pocket.
|
||||
```
|
||||
@@ -73,7 +73,7 @@ Your contractor rolodex, always in your pocket.
|
||||
|
||||
These aren't one-time tasks. They come back.
|
||||
|
||||
Casera knows that. Set the frequency once, and we'll remind you every time it's due.
|
||||
honeyDue knows that. Set the frequency once, and we'll remind you every time it's due.
|
||||
|
||||
Smart home maintenance → [link]
|
||||
```
|
||||
@@ -87,7 +87,7 @@ Finally, a way to actually SEE your home maintenance:
|
||||
🟢 Upcoming — you're ahead of the game
|
||||
✅ Completed — feel that satisfaction
|
||||
|
||||
Casera's kanban view. Simple. Visual. Effective.
|
||||
honeyDue's kanban view. Simple. Visual. Effective.
|
||||
```
|
||||
|
||||
**Document Storage**
|
||||
@@ -97,7 +97,7 @@ Where's the warranty for your fridge?
|
||||
A) Filing cabinet somewhere
|
||||
B) Email from 3 years ago
|
||||
C) No idea
|
||||
D) Casera — because you uploaded it when you bought it
|
||||
D) honeyDue — because you uploaded it when you bought it
|
||||
|
||||
Be option D.
|
||||
```
|
||||
@@ -109,7 +109,7 @@ Be option D.
|
||||
|
||||
Sound familiar?
|
||||
|
||||
Casera lets you share your home with family members. Everyone sees what needs doing. No more crossed wires.
|
||||
honeyDue lets you share your home with family members. Everyone sees what needs doing. No more crossed wires.
|
||||
|
||||
(pun intended)
|
||||
```
|
||||
@@ -152,7 +152,7 @@ Reply with:
|
||||
|
||||
5/ Smoke detector batteries — Every 6 months. Life-saving.
|
||||
|
||||
Save this. Or better yet, add them all to Casera and never think about it again.
|
||||
Save this. Or better yet, add them all to honeyDue and never think about it again.
|
||||
```
|
||||
|
||||
---
|
||||
@@ -163,7 +163,7 @@ Save this. Or better yet, add them all to Casera and never think about it again.
|
||||
|
||||
**Slide 1:**
|
||||
```
|
||||
MEET CASERA
|
||||
MEET HONEYDUE
|
||||
The home maintenance app you didn't know you needed
|
||||
(but definitely do)
|
||||
→
|
||||
@@ -187,7 +187,7 @@ Sound familiar?
|
||||
```
|
||||
THE SOLUTION
|
||||
|
||||
Casera organizes everything:
|
||||
honeyDue organizes everything:
|
||||
|
||||
📋 Tasks — recurring reminders that actually recur
|
||||
📄 Documents — warranties, manuals, receipts
|
||||
@@ -219,7 +219,7 @@ GET STARTED FREE
|
||||
Your home works hard for you.
|
||||
Let's return the favor.
|
||||
|
||||
Download Casera
|
||||
Download honeyDue
|
||||
Link in bio 🏠
|
||||
```
|
||||
|
||||
@@ -232,7 +232,7 @@ Link in bio 🏠
|
||||
Caption:
|
||||
Sunday morning coffee hits different when you're not mentally running through everything you forgot to maintain.
|
||||
|
||||
Casera handles the remembering.
|
||||
honeyDue handles the remembering.
|
||||
You handle the relaxing.
|
||||
|
||||
#homeowner #homeownership #adulting #homemaintenance #organizedhome #homeownertips #firsttimehomebuyer
|
||||
@@ -247,7 +247,7 @@ Most could be prevented with regular maintenance.
|
||||
|
||||
The unsexy truth: Boring scheduled tasks save exciting amounts of money.
|
||||
|
||||
Casera makes the boring part automatic.
|
||||
honeyDue makes the boring part automatic.
|
||||
|
||||
#homeownerhacks #homemaintenance #savemoney #preventivemaintenance #homecare
|
||||
```
|
||||
@@ -261,7 +261,7 @@ Then the AC died in July because I forgot the spring tune-up.
|
||||
|
||||
$4,200 lesson learned.
|
||||
|
||||
Now I use Casera."
|
||||
Now I use honeyDue."
|
||||
|
||||
— Every homeowner, eventually
|
||||
|
||||
@@ -281,7 +281,7 @@ Hook: "Nobody told me homes need THIS much maintenance"
|
||||
Content:
|
||||
- Quick cuts of common maintenance tasks
|
||||
- Text overlays with frequency
|
||||
- End with Casera app demo
|
||||
- End with honeyDue app demo
|
||||
|
||||
Audio: Trending sound
|
||||
```
|
||||
@@ -303,7 +303,7 @@ Audio: Satisfying/success sound
|
||||
```
|
||||
Weekly recurring content:
|
||||
- One maintenance tip per week
|
||||
- Swipe up to add task to Casera
|
||||
- Swipe up to add task to honeyDue
|
||||
- Build habit + community
|
||||
```
|
||||
|
||||
@@ -314,7 +314,7 @@ Weekly recurring content:
|
||||
### Launch Announcement
|
||||
|
||||
```
|
||||
I'm excited to share something I've been working on: Casera.
|
||||
I'm excited to share something I've been working on: honeyDue.
|
||||
|
||||
It started with a simple frustration. As a homeowner, I was juggling:
|
||||
• Sticky notes for maintenance reminders
|
||||
@@ -324,7 +324,7 @@ It started with a simple frustration. As a homeowner, I was juggling:
|
||||
|
||||
There had to be a better way.
|
||||
|
||||
Casera is that better way.
|
||||
honeyDue is that better way.
|
||||
|
||||
It's a home maintenance app that brings everything together:
|
||||
→ Recurring task reminders (that actually recur)
|
||||
@@ -361,7 +361,7 @@ It's not about automation. It's about organization.
|
||||
|
||||
The homes that last aren't the most automated. They're the most maintained.
|
||||
|
||||
That's why we built Casera — not another smart device, but a smart system for the maintenance that actually matters.
|
||||
That's why we built honeyDue — not another smart device, but a smart system for the maintenance that actually matters.
|
||||
|
||||
Sometimes the most valuable technology is the simplest.
|
||||
|
||||
@@ -371,7 +371,7 @@ Sometimes the most valuable technology is the simplest.
|
||||
### Feature Announcement Template
|
||||
|
||||
```
|
||||
New in Casera: [FEATURE NAME]
|
||||
New in honeyDue: [FEATURE NAME]
|
||||
|
||||
The problem: [One sentence describing pain point]
|
||||
|
||||
@@ -388,7 +388,7 @@ Update your app to try it today.
|
||||
|
||||
What feature should we build next?
|
||||
|
||||
#productupdate #casera #hometech
|
||||
#productupdate #honeydue #hometech
|
||||
```
|
||||
|
||||
---
|
||||
@@ -397,7 +397,7 @@ What feature should we build next?
|
||||
|
||||
### Primary Hashtags (use on every post)
|
||||
```
|
||||
#Casera #HomeMaintenance #HomeOwner #HomeManagement
|
||||
#honeyDue #HomeMaintenance #HomeOwner #HomeManagement
|
||||
```
|
||||
|
||||
### Secondary Hashtags (rotate based on content)
|
||||
@@ -435,12 +435,12 @@ Winter: #WinterHome #HeatingSystem
|
||||
|
||||
### Positive Feedback
|
||||
```
|
||||
Thanks so much! 🏠 We're glad Casera is helping you stay on top of things. Let us know if there's anything we can do better!
|
||||
Thanks so much! 🏠 We're glad honeyDue is helping you stay on top of things. Let us know if there's anything we can do better!
|
||||
```
|
||||
|
||||
### Feature Request
|
||||
```
|
||||
Love this idea! We're adding it to our list. Thanks for helping us make Casera better! 🙏
|
||||
Love this idea! We're adding it to our list. Thanks for helping us make honeyDue better! 🙏
|
||||
```
|
||||
|
||||
### Support Issue
|
||||
@@ -450,5 +450,5 @@ Sorry you're running into trouble! DM us the details and we'll get it sorted out
|
||||
|
||||
### Competitor Mention
|
||||
```
|
||||
Great question! We focus on [specific differentiator]. Happy to share more about how Casera might fit your needs — DM us anytime!
|
||||
Great question! We focus on [specific differentiator]. Happy to share more about how honeyDue might fit your needs — DM us anytime!
|
||||
```
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
openapi: 3.0.3
|
||||
info:
|
||||
title: Casera (MyCrib) API
|
||||
title: honeyDue API
|
||||
description: |
|
||||
REST API for the Casera property management platform.
|
||||
REST API for the honeyDue property management platform.
|
||||
Consumed by iOS (SwiftUI) and Android (Compose) mobile clients via Kotlin Multiplatform.
|
||||
|
||||
## Authentication
|
||||
@@ -24,10 +24,10 @@ info:
|
||||
All errors follow a consistent JSON shape. Validation errors include a `details` map.
|
||||
version: 2.0.0
|
||||
contact:
|
||||
name: Casera Team
|
||||
name: honeyDue Team
|
||||
|
||||
servers:
|
||||
- url: https://mycrib.treytartt.com/api
|
||||
- url: https://honeyDue.treytartt.com/api
|
||||
description: Production
|
||||
- url: http://127.0.0.1:8000/api
|
||||
description: Local development (iOS simulator)
|
||||
@@ -813,7 +813,7 @@ paths:
|
||||
post:
|
||||
tags: [Residences]
|
||||
operationId: generateSharePackage
|
||||
summary: Generate a share package (.casera file metadata)
|
||||
summary: Generate a share package (.honeydue file metadata)
|
||||
security:
|
||||
- tokenAuth: []
|
||||
parameters:
|
||||
|
||||
2
go.mod
2
go.mod
@@ -1,4 +1,4 @@
|
||||
module github.com/treytartt/casera-api
|
||||
module github.com/treytartt/honeydue-api
|
||||
|
||||
go 1.24.0
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dto
|
||||
|
||||
import "github.com/treytartt/casera-api/internal/middleware"
|
||||
import "github.com/treytartt/honeydue-api/internal/middleware"
|
||||
|
||||
// PaginationParams holds pagination query parameters
|
||||
type PaginationParams struct {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
)
|
||||
|
||||
func TestAdminSortBy_ValidColumn_Works(t *testing.T) {
|
||||
|
||||
@@ -7,9 +7,9 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminUserManagementHandler handles admin user management endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminAppleSocialAuthHandler handles admin Apple social auth management endpoints
|
||||
|
||||
@@ -5,10 +5,10 @@ import (
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
)
|
||||
|
||||
// AdminAuthHandler handles admin authentication endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminAuthTokenHandler handles admin auth token management endpoints
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
"github.com/shopspring/decimal"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminCompletionHandler handles admin task completion management endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminCompletionImageHandler handles admin task completion image management endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminConfirmationCodeHandler handles admin confirmation code management endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminContractorHandler handles admin contractor management endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/task/scopes"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/task/scopes"
|
||||
)
|
||||
|
||||
// AdminDashboardHandler handles admin dashboard endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminDeviceHandler handles admin device management endpoints
|
||||
|
||||
@@ -9,8 +9,8 @@ import (
|
||||
"github.com/shopspring/decimal"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminDocumentHandler handles admin document management endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminDocumentImageHandler handles admin document image management endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminFeatureBenefitHandler handles admin feature benefit management endpoints
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminLimitationsHandler handles subscription limitations management
|
||||
|
||||
@@ -9,10 +9,10 @@ import (
|
||||
"github.com/rs/zerolog/log"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/notifications"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/notifications"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// AdminLookupHandler handles admin lookup table management endpoints
|
||||
|
||||
@@ -10,10 +10,10 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/push"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/push"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// AdminNotificationHandler handles admin notification management endpoints
|
||||
@@ -363,7 +363,7 @@ func (h *AdminNotificationHandler) SendTestEmail(c echo.Context) error {
|
||||
<h2 style="color: #333;">` + escapedSubject + `</h2>
|
||||
<div style="color: #666; line-height: 1.6;">` + escapedBody + `</div>
|
||||
<hr style="border: none; border-top: 1px solid #eee; margin: 30px 0;">
|
||||
<p style="color: #999; font-size: 12px;">This is a test email sent from Casera Admin Panel.</p>
|
||||
<p style="color: #999; font-size: 12px;">This is a test email sent from honeyDue Admin Panel.</p>
|
||||
</body>
|
||||
</html>`
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminNotificationPrefsHandler handles notification preference management
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// AdminOnboardingHandler handles admin onboarding email operations
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminPasswordResetCodeHandler handles admin password reset code management endpoints
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminPromotionHandler handles admin promotion management endpoints
|
||||
|
||||
@@ -9,8 +9,8 @@ import (
|
||||
"github.com/shopspring/decimal"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminResidenceHandler handles admin residence management endpoints
|
||||
|
||||
@@ -12,8 +12,8 @@ import (
|
||||
"github.com/rs/zerolog/log"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// AdminSettingsHandler handles system settings management
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminShareCodeHandler handles admin share code management endpoints
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminSubscriptionHandler handles admin subscription management endpoints
|
||||
|
||||
@@ -9,8 +9,8 @@ import (
|
||||
"github.com/shopspring/decimal"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminTaskHandler handles admin task management endpoints
|
||||
|
||||
@@ -10,8 +10,8 @@ import (
|
||||
"github.com/rs/zerolog/log"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// AdminTaskTemplateHandler handles admin task template management endpoints
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminUserHandler handles admin user management endpoints
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/dto"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/dto"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// AdminUserProfileHandler handles admin user profile management endpoints
|
||||
|
||||
@@ -9,13 +9,13 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/admin/handlers"
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/monitoring"
|
||||
"github.com/treytartt/casera-api/internal/push"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/admin/handlers"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/monitoring"
|
||||
"github.com/treytartt/honeydue-api/internal/push"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// Dependencies holds optional services for admin routes
|
||||
|
||||
@@ -9,9 +9,9 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/dto/responses"
|
||||
"github.com/treytartt/casera-api/internal/i18n"
|
||||
customvalidator "github.com/treytartt/casera-api/internal/validator"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/responses"
|
||||
"github.com/treytartt/honeydue-api/internal/i18n"
|
||||
customvalidator "github.com/treytartt/honeydue-api/internal/validator"
|
||||
)
|
||||
|
||||
// HTTPErrorHandler handles all errors returned from handlers in a consistent way.
|
||||
|
||||
@@ -36,7 +36,7 @@ type ServerConfig struct {
|
||||
CorsAllowedOrigins []string // Comma-separated origins for CORS (production only; debug uses wildcard)
|
||||
Timezone string
|
||||
StaticDir string // Directory for static landing page files
|
||||
BaseURL string // Public base URL for email tracking links (e.g., https://casera.app)
|
||||
BaseURL string // Public base URL for email tracking links (e.g., https://honeyDue.treytartt.com)
|
||||
}
|
||||
|
||||
type DatabaseConfig struct {
|
||||
@@ -80,7 +80,7 @@ type PushConfig struct {
|
||||
}
|
||||
|
||||
type AppleAuthConfig struct {
|
||||
ClientID string // Bundle ID (e.g., com.tt.casera.CaseraDev)
|
||||
ClientID string // Bundle ID (e.g., com.tt.honeyDue.honeyDueDev)
|
||||
TeamID string // Apple Developer Team ID
|
||||
}
|
||||
|
||||
@@ -95,14 +95,14 @@ type AppleIAPConfig struct {
|
||||
KeyPath string // Path to .p8 private key file
|
||||
KeyID string // Key ID from App Store Connect
|
||||
IssuerID string // Issuer ID from App Store Connect
|
||||
BundleID string // App bundle ID (e.g., com.tt.casera)
|
||||
BundleID string // App bundle ID (e.g., com.tt.honeyDue)
|
||||
Sandbox bool // Use sandbox environment for testing
|
||||
}
|
||||
|
||||
// GoogleIAPConfig holds Google Play Developer API configuration
|
||||
type GoogleIAPConfig struct {
|
||||
ServiceAccountPath string // Path to service account JSON file
|
||||
PackageName string // Android package name (e.g., com.tt.casera)
|
||||
PackageName string // Android package name (e.g., com.tt.honeyDue)
|
||||
}
|
||||
|
||||
// StripeConfig holds Stripe payment configuration
|
||||
@@ -293,13 +293,13 @@ func setDefaults() {
|
||||
viper.SetDefault("ALLOWED_HOSTS", "localhost,127.0.0.1")
|
||||
viper.SetDefault("TIMEZONE", "UTC")
|
||||
viper.SetDefault("STATIC_DIR", "/app/static")
|
||||
viper.SetDefault("BASE_URL", "https://casera.app")
|
||||
viper.SetDefault("BASE_URL", "https://honeyDue.treytartt.com")
|
||||
|
||||
// Database defaults
|
||||
viper.SetDefault("DB_HOST", "localhost")
|
||||
viper.SetDefault("DB_PORT", 5432)
|
||||
viper.SetDefault("POSTGRES_USER", "postgres")
|
||||
viper.SetDefault("POSTGRES_DB", "casera")
|
||||
viper.SetDefault("POSTGRES_DB", "honeydue")
|
||||
viper.SetDefault("DB_SSLMODE", "disable")
|
||||
viper.SetDefault("DB_MAX_OPEN_CONNS", 25)
|
||||
viper.SetDefault("DB_MAX_IDLE_CONNS", 10)
|
||||
@@ -315,10 +315,10 @@ func setDefaults() {
|
||||
viper.SetDefault("EMAIL_USE_TLS", true)
|
||||
viper.SetDefault("EMAIL_HOST_USER", "")
|
||||
viper.SetDefault("EMAIL_HOST_PASSWORD", "")
|
||||
viper.SetDefault("DEFAULT_FROM_EMAIL", "Casera <noreply@casera.com>")
|
||||
viper.SetDefault("DEFAULT_FROM_EMAIL", "honeyDue <noreply@honeyDue.treytartt.com>")
|
||||
|
||||
// Push notification defaults
|
||||
viper.SetDefault("APNS_TOPIC", "com.example.casera")
|
||||
viper.SetDefault("APNS_TOPIC", "com.tt.honeyDue")
|
||||
viper.SetDefault("APNS_USE_SANDBOX", true)
|
||||
viper.SetDefault("APNS_PRODUCTION", false)
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@ import (
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// zerologGormWriter adapts zerolog for GORM's logger interface
|
||||
@@ -422,7 +422,7 @@ func migrateGoAdmin() error {
|
||||
(2, 1, 3, 'Permissions', 'fa-ban', '/info/goadmin_permissions', ''),
|
||||
(2, 1, 4, 'Menu', 'fa-bars', '/menu', ''),
|
||||
(2, 1, 5, 'Operation Log', 'fa-history', '/info/goadmin_operation_log', ''),
|
||||
(0, 1, 3, 'MyCrib', 'fa-home', '', ''),
|
||||
(0, 1, 3, 'HoneyDue', 'fa-home', '', ''),
|
||||
(8, 1, 1, 'Users', 'fa-user', '/info/users', ''),
|
||||
(8, 1, 2, 'Residences', 'fa-building', '/info/residences', ''),
|
||||
(8, 1, 3, 'Tasks', 'fa-tasks', '/info/tasks', ''),
|
||||
@@ -444,14 +444,14 @@ func migrateGoAdmin() error {
|
||||
// Seed default Next.js admin user only on first run.
|
||||
// Password is NOT reset on subsequent migrations to preserve operator changes.
|
||||
var adminCount int64
|
||||
db.Raw(`SELECT COUNT(*) FROM admin_users WHERE email = 'admin@mycrib.com'`).Scan(&adminCount)
|
||||
db.Raw(`SELECT COUNT(*) FROM admin_users WHERE email = 'admin@honeydue.com'`).Scan(&adminCount)
|
||||
if adminCount == 0 {
|
||||
log.Info().Msg("Seeding default admin user for Next.js admin panel...")
|
||||
db.Exec(`
|
||||
INSERT INTO admin_users (email, password, first_name, last_name, role, is_active, created_at, updated_at)
|
||||
VALUES ('admin@mycrib.com', '$2a$10$t5hGjdXQLxr9Z0193qx.Tef6hd1vYI3JvrfX/piKx2qS9UvQ41I9O', 'Admin', 'User', 'super_admin', true, NOW(), NOW())
|
||||
VALUES ('admin@honeydue.com', '$2a$10$t5hGjdXQLxr9Z0193qx.Tef6hd1vYI3JvrfX/piKx2qS9UvQ41I9O', 'Admin', 'User', 'super_admin', true, NOW(), NOW())
|
||||
`)
|
||||
log.Info().Msg("Default admin user created: admin@mycrib.com")
|
||||
log.Info().Msg("Default admin user created: admin@honeydue.com")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// CreateDocumentRequest represents the request to create a document
|
||||
|
||||
@@ -3,7 +3,7 @@ package responses
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// UserResponse represents a user in API responses
|
||||
|
||||
@@ -3,7 +3,7 @@ package responses
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// ContractorSpecialtyResponse represents a contractor specialty
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// DocumentUserResponse represents a user in document context
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// ResidenceTypeResponse represents a residence type in the API response
|
||||
@@ -106,7 +106,7 @@ type GenerateShareCodeResponse struct {
|
||||
}
|
||||
|
||||
// SharePackageResponse represents the response for generating a share package
|
||||
// This contains the share code plus metadata for the .casera file
|
||||
// This contains the share code plus metadata for the .honeydue file
|
||||
type SharePackageResponse struct {
|
||||
ShareCode string `json:"share_code"`
|
||||
ResidenceName string `json:"residence_name"`
|
||||
|
||||
@@ -6,9 +6,9 @@ import (
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/task/categorization"
|
||||
"github.com/treytartt/casera-api/internal/task/predicates"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/task/categorization"
|
||||
"github.com/treytartt/honeydue-api/internal/task/predicates"
|
||||
)
|
||||
|
||||
// TaskCategoryResponse represents a task category
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
)
|
||||
|
||||
// TaskTemplateResponse represents a task template in the API response
|
||||
|
||||
@@ -7,12 +7,12 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/dto/responses"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/validator"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/responses"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/validator"
|
||||
)
|
||||
|
||||
// AuthHandler handles authentication endpoints
|
||||
|
||||
@@ -10,11 +10,11 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/testutil"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/testutil"
|
||||
)
|
||||
|
||||
func setupAuthHandler(t *testing.T) (*AuthHandler, *echo.Echo, *repositories.UserRepository) {
|
||||
|
||||
@@ -6,10 +6,10 @@ import (
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// ContractorHandler handles contractor-related HTTP requests
|
||||
|
||||
@@ -10,10 +10,10 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/testutil"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/testutil"
|
||||
)
|
||||
|
||||
func setupContractorHandler(t *testing.T) (*ContractorHandler, *echo.Echo, *gorm.DB) {
|
||||
|
||||
@@ -10,12 +10,12 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/shopspring/decimal"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// DocumentHandler handles document-related HTTP requests
|
||||
|
||||
@@ -10,10 +10,10 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/testutil"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/testutil"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
||||
@@ -6,10 +6,10 @@ import (
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// MediaHandler handles authenticated media serving
|
||||
|
||||
@@ -6,8 +6,8 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// newTestStorageService creates a StorageService with a known upload directory for testing.
|
||||
|
||||
@@ -4,10 +4,10 @@ import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/testutil"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/testutil"
|
||||
)
|
||||
|
||||
// TestTaskHandler_NoAuth_Returns401 verifies that task handler endpoints return
|
||||
|
||||
@@ -6,9 +6,9 @@ import (
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// NotificationHandler handles notification-related HTTP requests
|
||||
|
||||
@@ -11,10 +11,10 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/testutil"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/testutil"
|
||||
)
|
||||
|
||||
func setupNotificationHandler(t *testing.T) (*NotificationHandler, *echo.Echo, *gorm.DB) {
|
||||
|
||||
@@ -6,12 +6,12 @@ import (
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/i18n"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/validator"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/i18n"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/validator"
|
||||
)
|
||||
|
||||
// ResidenceHandler handles residence-related HTTP requests
|
||||
@@ -221,7 +221,7 @@ func (h *ResidenceHandler) GenerateShareCode(c echo.Context) error {
|
||||
}
|
||||
|
||||
// GenerateSharePackage handles POST /api/residences/:id/generate-share-package/
|
||||
// Returns a share code with metadata for creating a .casera package file
|
||||
// Returns a share code with metadata for creating a .honeydue package file
|
||||
func (h *ResidenceHandler) GenerateSharePackage(c echo.Context) error {
|
||||
user, err := middleware.MustGetAuthUser(c)
|
||||
if err != nil {
|
||||
|
||||
@@ -11,11 +11,11 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/testutil"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/testutil"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
||||
@@ -8,9 +8,9 @@ import (
|
||||
"github.com/redis/go-redis/v9"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/dto/responses"
|
||||
"github.com/treytartt/casera-api/internal/i18n"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/responses"
|
||||
"github.com/treytartt/honeydue-api/internal/i18n"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// SeededDataResponse represents the unified seeded data response
|
||||
|
||||
@@ -5,9 +5,9 @@ import (
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// SubscriptionHandler handles subscription-related HTTP requests
|
||||
|
||||
@@ -17,10 +17,10 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/config"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/config"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// SubscriptionWebhookHandler handles subscription webhook callbacks
|
||||
|
||||
@@ -9,10 +9,10 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/shopspring/decimal"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// TaskHandler handles task-related HTTP requests
|
||||
|
||||
@@ -12,11 +12,11 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/dto/requests"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/repositories"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/casera-api/internal/testutil"
|
||||
"github.com/treytartt/honeydue-api/internal/dto/requests"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/repositories"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/testutil"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ import (
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// TaskTemplateHandler handles task template endpoints
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// TrackingHandler handles email tracking endpoints
|
||||
|
||||
@@ -6,10 +6,10 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/treytartt/casera-api/internal/apperrors"
|
||||
"github.com/treytartt/casera-api/internal/middleware"
|
||||
"github.com/treytartt/casera-api/internal/models"
|
||||
"github.com/treytartt/casera-api/internal/services"
|
||||
"github.com/treytartt/honeydue-api/internal/apperrors"
|
||||
"github.com/treytartt/honeydue-api/internal/middleware"
|
||||
"github.com/treytartt/honeydue-api/internal/models"
|
||||
"github.com/treytartt/honeydue-api/internal/services"
|
||||
)
|
||||
|
||||
// UploadHandler handles file upload endpoints
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user