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:
Trey t
2026-03-07 06:33:38 -06:00
parent 793e50ce52
commit 4976eafc6c
189 changed files with 831 additions and 831 deletions

View File

@@ -6,7 +6,7 @@ TIMEZONE=UTC
SECRET_KEY=your-secret-key-here-change-this-in-production SECRET_KEY=your-secret-key-here-change-this-in-production
# Database Settings (PostgreSQL) # Database Settings (PostgreSQL)
POSTGRES_DB=casera POSTGRES_DB=honeydue
POSTGRES_USER=postgres POSTGRES_USER=postgres
POSTGRES_PASSWORD=change-this-secure-password POSTGRES_PASSWORD=change-this-secure-password
DB_HOST=localhost DB_HOST=localhost
@@ -26,14 +26,14 @@ EMAIL_PORT=587
EMAIL_USE_TLS=true EMAIL_USE_TLS=true
EMAIL_HOST_USER=your-email@gmail.com EMAIL_HOST_USER=your-email@gmail.com
EMAIL_HOST_PASSWORD=your-app-password 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) # APNs Settings (iOS Push Notifications)
# Direct APNs integration - no external push server needed # Direct APNs integration - no external push server needed
APNS_AUTH_KEY_PATH=/path/to/AuthKey_XXXXXX.p8 APNS_AUTH_KEY_PATH=/path/to/AuthKey_XXXXXX.p8
APNS_AUTH_KEY_ID=XXXXXXXXXX APNS_AUTH_KEY_ID=XXXXXXXXXX
APNS_TEAM_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 APNS_PRODUCTION=false # Set to true for production APNs, false for sandbox
# FCM Settings (Android Push Notifications) # FCM Settings (Android Push Notifications)

View File

@@ -60,10 +60,10 @@ jobs:
cache: true cache: true
- name: Build API - 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 - 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: lint:
name: Lint name: Lint

View File

@@ -40,7 +40,7 @@ This document contains:
**Quick reference:** **Quick reference:**
```go ```go
// Use these - DON'T write inline task logic // 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.IsCompleted(t) // Check if task is completed
task.IsOverdue(t, now) // Check if task is overdue task.IsOverdue(t, now) // Check if task is overdue
@@ -50,7 +50,7 @@ task.CategorizeTask(t, 30) // Get kanban column for task
## Project Overview ## 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:** **Tech Stack:**
- **HTTP Framework**: Echo v4 - **HTTP Framework**: Echo v4
@@ -65,7 +65,7 @@ Casera API is a Go REST API for the MyCrib/Casera property management platform.
## Project Structure ## Project Structure
``` ```
myCribAPI-go/ honeyDueAPI-go/
├── cmd/ ├── cmd/
│ ├── api/main.go # API server entry point │ ├── api/main.go # API server entry point
│ └── worker/main.go # Background worker entry point │ └── worker/main.go # Background worker entry point
@@ -163,7 +163,7 @@ internal/task/
**Always use this package for task logic:** **Always use this package for task logic:**
```go ```go
import "github.com/treytartt/casera-api/internal/task" import "github.com/treytartt/honeydue-api/internal/task"
// Predicates (in-memory checks) // Predicates (in-memory checks)
if task.IsCompleted(t) { ... } if task.IsCompleted(t) { ... }
@@ -194,7 +194,7 @@ api.Use(middleware.AuthRequired(db))
Use structured errors from `internal/apperrors/`: Use structured errors from `internal/apperrors/`:
```go ```go
import "github.com/treytartt/casera-api/internal/apperrors" import "github.com/treytartt/honeydue-api/internal/apperrors"
// Return typed errors // Return typed errors
return apperrors.NewNotFoundError("task", taskID) return apperrors.NewNotFoundError("task", taskID)
@@ -401,5 +401,5 @@ func TestTaskHandler_Create(t *testing.T) {
## Related Repositories ## 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 - **Root Docs**: `../CLAUDE.md` - Full-stack documentation

View File

@@ -1,8 +1,8 @@
.PHONY: build run test contract-test clean deps lint docker-build docker-up docker-down migrate .PHONY: build run test contract-test clean deps lint docker-build docker-up docker-down migrate
# Binary names # Binary names
API_BINARY=casera-api API_BINARY=honeydue-api
WORKER_BINARY=casera-worker WORKER_BINARY=honeydue-worker
# Build flags # Build flags
LDFLAGS=-ldflags "-s -w" LDFLAGS=-ldflags "-s -w"
@@ -85,9 +85,9 @@ docker-restart:
# Docker commands (prod — builds production images) # Docker commands (prod — builds production images)
docker-build-prod: docker-build-prod:
docker build --target api -t $${REGISTRY:-ghcr.io/treytartt}/casera-api:$${TAG:-latest} . docker build --target api -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-api:$${TAG:-latest} .
docker build --target worker -t $${REGISTRY:-ghcr.io/treytartt}/casera-worker:$${TAG:-latest} . docker build --target worker -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-worker:$${TAG:-latest} .
docker build --target admin -t $${REGISTRY:-ghcr.io/treytartt}/casera-admin:$${TAG:-latest} . docker build --target admin -t $${REGISTRY:-ghcr.io/treytartt}/honeydue-admin:$${TAG:-latest} .
# Database migrations # Database migrations
migrate-up: migrate-up:

View File

@@ -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 ## Tech Stack
@@ -31,7 +31,7 @@ This starts PostgreSQL, Redis, the API server, background worker, and admin pane
```bash ```bash
# 1. Clone the repo # 1. Clone the repo
git clone <repo-url> git clone <repo-url>
cd myCribAPI-go cd honeyDueAPI-go
# 2. Create your environment file # 2. Create your environment file
cp .env.example .env cp .env.example .env
@@ -41,11 +41,11 @@ cp .env.example .env
make docker-dev make docker-dev
# 4. Seed the database with lookup data (required) # 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 # 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 honeydue-db psql -U honeydue -d honeydue < 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/003_task_templates.sql
# 6. Verify the API is running # 6. Verify the API is running
curl http://localhost:8000/api/health/ 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 ```bash
# 1. Clone and enter the repo # 1. Clone and enter the repo
git clone <repo-url> git clone <repo-url>
cd myCribAPI-go cd honeyDueAPI-go
# 2. Install Go dependencies # 2. Install Go dependencies
make deps make deps
@@ -77,9 +77,9 @@ cp .env.example .env
# - Set REDIS_URL=redis://localhost:6379/0 # - Set REDIS_URL=redis://localhost:6379/0
# 5. Seed the database # 5. Seed the database
psql -h localhost -p 5433 -U casera -d casera < seeds/001_lookups.sql psql -h localhost -p 5433 -U honeydue -d honeydue < seeds/001_lookups.sql
psql -h localhost -p 5433 -U casera -d casera < seeds/002_test_data.sql psql -h localhost -p 5433 -U honeydue -d honeydue < 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/003_task_templates.sql
# 6. Run the API server # 6. Run the API server
make run make run
@@ -101,7 +101,7 @@ brew services start postgresql@16
brew services start redis brew services start redis
# Create the database # Create the database
createdb casera createdb honeydue
# Then follow Option B steps 2-7, using: # Then follow Option B steps 2-7, using:
# DB_HOST=localhost, DB_PORT=5432, POSTGRES_USER=<your-user>, POSTGRES_PASSWORD=<your-password> # 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 | | `PORT` | Server port | `8000` | No |
| `DEBUG` | Enable debug logging | `true` | No | | `DEBUG` | Enable debug logging | `true` | No |
| `SECRET_KEY` | JWT signing secret (32+ chars) | — | **Yes** | | `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_USER` | Database user | `postgres` | Yes |
| `POSTGRES_PASSWORD` | Database password | — | Yes | | `POSTGRES_PASSWORD` | Database password | — | Yes |
| `DB_HOST` | Database host | `localhost` | Yes | | `DB_HOST` | Database host | `localhost` | Yes |
@@ -133,7 +133,7 @@ Copy `.env.example` to `.env` and configure:
## Project Structure ## Project Structure
``` ```
myCribAPI-go/ honeyDueAPI-go/
├── cmd/ ├── cmd/
│ ├── api/main.go # API server entry point │ ├── api/main.go # API server entry point
│ └── worker/main.go # Background worker 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 git push dokku main
# Seed lookup data # 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 # Check logs
dokku logs casera-api -t dokku logs honeydue-api -t
``` ```
### Docker Swarm ### Docker Swarm
@@ -277,20 +277,20 @@ dokku logs casera-api -t
```bash ```bash
# Build and push production images # Build and push production images
make docker-build-prod make docker-build-prod
docker push ${REGISTRY}/casera-api:${TAG} docker push ${REGISTRY}/honeydue-api:${TAG}
docker push ${REGISTRY}/casera-worker:${TAG} docker push ${REGISTRY}/honeydue-worker:${TAG}
docker push ${REGISTRY}/casera-admin:${TAG} docker push ${REGISTRY}/honeydue-admin:${TAG}
# Deploy the stack (all env vars must be set in .env or environment) # 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 ## 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 - **Task Logic Docs**: `docs/TASK_LOGIC_ARCHITECTURE.md` — required reading before task-related work
- **Push Notification Docs**: `docs/PUSH_NOTIFICATIONS.md` - **Push Notification Docs**: `docs/PUSH_NOTIFICATIONS.md`
## License ## License
Proprietary — Casera Proprietary — honeyDue

View File

@@ -239,55 +239,55 @@ export default function AutomationReferencePage() {
<TableBody> <TableBody>
<TableRow> <TableRow>
<TableCell className="font-medium">Welcome Email</TableCell> <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>User registration (email/password)</TableCell>
<TableCell>24 hours (verification code)</TableCell> <TableCell>24 hours (verification code)</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium">Apple Welcome</TableCell> <TableCell className="font-medium">Apple Welcome</TableCell>
<TableCell>Welcome to Casera!</TableCell> <TableCell>Welcome to honeyDue!</TableCell>
<TableCell>Apple Sign In registration</TableCell> <TableCell>Apple Sign In registration</TableCell>
<TableCell>-</TableCell> <TableCell>-</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium">Google Welcome</TableCell> <TableCell className="font-medium">Google Welcome</TableCell>
<TableCell>Welcome to Casera!</TableCell> <TableCell>Welcome to honeyDue!</TableCell>
<TableCell>Google Sign In registration</TableCell> <TableCell>Google Sign In registration</TableCell>
<TableCell>-</TableCell> <TableCell>-</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium">Post-Verification</TableCell> <TableCell className="font-medium">Post-Verification</TableCell>
<TableCell>You&apos;re All Set! Getting Started with Casera</TableCell> <TableCell>You&apos;re All Set! Getting Started with honeyDue</TableCell>
<TableCell>After email verification</TableCell> <TableCell>After email verification</TableCell>
<TableCell>-</TableCell> <TableCell>-</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium">Verification Email</TableCell> <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>Resend verification code</TableCell>
<TableCell>24 hours</TableCell> <TableCell>24 hours</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium">Password Reset</TableCell> <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>Password reset request</TableCell>
<TableCell>15 minutes</TableCell> <TableCell>15 minutes</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium">Password Changed</TableCell> <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>After password change</TableCell>
<TableCell>-</TableCell> <TableCell>-</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium">Task Completed</TableCell> <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>When task is completed (if email_task_completed = true)</TableCell>
<TableCell>-</TableCell> <TableCell>-</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium">Tasks Report</TableCell> <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>User requests PDF export</TableCell>
<TableCell>-</TableCell> <TableCell>-</TableCell>
</TableRow> </TableRow>
@@ -311,14 +311,14 @@ export default function AutomationReferencePage() {
<TableCell className="font-medium"> <TableCell className="font-medium">
<Badge variant="outline">no_residence</Badge> <Badge variant="outline">no_residence</Badge>
</TableCell> </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> <TableCell>2+ days since registration, no residence created</TableCell>
</TableRow> </TableRow>
<TableRow> <TableRow>
<TableCell className="font-medium"> <TableCell className="font-medium">
<Badge variant="outline">no_tasks</Badge> <Badge variant="outline">no_tasks</Badge>
</TableCell> </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> <TableCell>5+ days since first residence, no tasks created</TableCell>
</TableRow> </TableRow>
</TableBody> </TableBody>

View File

@@ -42,9 +42,9 @@ export function UserDetailClient() {
const [showPushDialog, setShowPushDialog] = useState(false); const [showPushDialog, setShowPushDialog] = useState(false);
const [showEmailDialog, setShowEmailDialog] = useState(false); const [showEmailDialog, setShowEmailDialog] = useState(false);
const [pushTitle, setPushTitle] = useState('Test Notification'); const [pushTitle, setPushTitle] = useState('Test Notification');
const [pushBody, setPushBody] = useState('This is a test push notification from Casera Admin.'); const [pushBody, setPushBody] = useState('This is a test push notification from honeyDue Admin.');
const [emailSubject, setEmailSubject] = useState('Test Email from Casera'); const [emailSubject, setEmailSubject] = useState('Test Email from honeyDue');
const [emailBody, setEmailBody] = useState('This is a test email sent from the Casera Admin Panel.'); const [emailBody, setEmailBody] = useState('This is a test email sent from the honeyDue Admin Panel.');
const { data: user, isLoading, error } = useQuery({ const { data: user, isLoading, error } = useQuery({
queryKey: ['user', userId], queryKey: ['user', userId],

View File

@@ -15,8 +15,8 @@ const geistMono = Geist_Mono({
}); });
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Casera Admin", title: "honeyDue Admin",
description: "Casera Administration Panel", description: "honeyDue Administration Panel",
}; };
export default function RootLayout({ export default function RootLayout({

View File

@@ -100,7 +100,7 @@ export function AppSidebar() {
<SidebarHeader className="border-b px-6 py-4"> <SidebarHeader className="border-b px-6 py-4">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Building2 className="h-6 w-6" /> <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> </div>
</SidebarHeader> </SidebarHeader>

View File

@@ -34,7 +34,7 @@ export function LoginForm() {
<Card className="w-full max-w-md"> <Card className="w-full max-w-md">
<CardHeader className="space-y-1"> <CardHeader className="space-y-1">
<CardTitle className="text-2xl font-bold text-center"> <CardTitle className="text-2xl font-bold text-center">
Casera Admin honeyDue Admin
</CardTitle> </CardTitle>
<CardDescription className="text-center"> <CardDescription className="text-center">
Enter your credentials to access the admin panel Enter your credentials to access the admin panel
@@ -53,7 +53,7 @@ export function LoginForm() {
<Input <Input
id="email" id="email"
type="email" type="email"
placeholder="admin@casera.app" placeholder="admin@honeydue.app"
value={email} value={email}
onChange={(e) => setEmail(e.target.value)} onChange={(e) => setEmail(e.target.value)}
required required

View File

@@ -1,6 +1,6 @@
{ {
"name": "casera-api", "name": "honeydue-api",
"description": "Casera API (Go)", "description": "honeyDue API (Go)",
"scripts": {}, "scripts": {},
"healthchecks": { "healthchecks": {
"web": [ "web": [

View File

@@ -1,6 +1,6 @@
{ {
"version": "1", "version": "1",
"name": "Casera API (Go)", "name": "honeyDue API (Go)",
"type": "collection", "type": "collection",
"ignore": [ "ignore": [
"node_modules", "node_modules",

View File

@@ -1,5 +1,5 @@
vars { vars {
base_url: https://casera.treytartt.com base_url: https://honeyDue.treytartt.com
api_url: {{base_url}}/api api_url: {{base_url}}/api
auth_token: 64eea3e59ecdf58a35a4fb45f4797413a3f96456 auth_token: 64eea3e59ecdf58a35a4fb45f4797413a3f96456
} }

View File

@@ -12,14 +12,14 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/database" "github.com/treytartt/honeydue-api/internal/database"
"github.com/treytartt/casera-api/internal/i18n" "github.com/treytartt/honeydue-api/internal/i18n"
"github.com/treytartt/casera-api/internal/monitoring" "github.com/treytartt/honeydue-api/internal/monitoring"
"github.com/treytartt/casera-api/internal/push" "github.com/treytartt/honeydue-api/internal/push"
"github.com/treytartt/casera-api/internal/router" "github.com/treytartt/honeydue-api/internal/router"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/pkg/utils" "github.com/treytartt/honeydue-api/pkg/utils"
) )
func main() { func main() {
@@ -48,7 +48,7 @@ func main() {
Str("db_name", cfg.Database.Database). Str("db_name", cfg.Database.Database).
Str("db_user", cfg.Database.User). Str("db_user", cfg.Database.User).
Str("redis_url", cfg.Redis.URL). Str("redis_url", cfg.Redis.URL).
Msg("Starting MyCrib API server") Msg("Starting HoneyDue API server")
// Connect to database (retry with backoff) // Connect to database (retry with backoff)
var db *gorm.DB var db *gorm.DB

View File

@@ -11,14 +11,14 @@ import (
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/database" "github.com/treytartt/honeydue-api/internal/database"
"github.com/treytartt/casera-api/internal/monitoring" "github.com/treytartt/honeydue-api/internal/monitoring"
"github.com/treytartt/casera-api/internal/push" "github.com/treytartt/honeydue-api/internal/push"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/worker/jobs" "github.com/treytartt/honeydue-api/internal/worker/jobs"
"github.com/treytartt/casera-api/pkg/utils" "github.com/treytartt/honeydue-api/pkg/utils"
) )
func main() { func main() {

View File

@@ -1,6 +1,6 @@
# Deploy Folder # 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: Run deploy with:

View File

@@ -5,10 +5,10 @@ DEPLOY_MANAGER_SSH_PORT=22
DEPLOY_SSH_KEY_PATH=~/.ssh/id_ed25519 DEPLOY_SSH_KEY_PATH=~/.ssh/id_ed25519
# Stack settings # Stack settings
DEPLOY_STACK_NAME=casera DEPLOY_STACK_NAME=honeydue
DEPLOY_REMOTE_DIR=/opt/casera/deploy DEPLOY_REMOTE_DIR=/opt/honeydue/deploy
DEPLOY_WAIT_SECONDS=420 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 # Replicas and published ports
API_REPLICAS=3 API_REPLICAS=3

View File

@@ -1,20 +1,20 @@
# API service settings # API service settings
DEBUG=false DEBUG=false
ALLOWED_HOSTS=api.casera.app,casera.app ALLOWED_HOSTS=api.honeyDue.treytartt.com,honeyDue.treytartt.com
CORS_ALLOWED_ORIGINS=https://casera.app,https://admin.casera.app CORS_ALLOWED_ORIGINS=https://honeyDue.treytartt.com,https://admin.honeyDue.treytartt.com
TIMEZONE=UTC TIMEZONE=UTC
BASE_URL=https://casera.app BASE_URL=https://honeyDue.treytartt.com
PORT=8000 PORT=8000
# Admin service settings # Admin service settings
NEXT_PUBLIC_API_URL=https://api.casera.app NEXT_PUBLIC_API_URL=https://api.honeyDue.treytartt.com
ADMIN_PANEL_URL=https://admin.casera.app ADMIN_PANEL_URL=https://admin.honeyDue.treytartt.com
# Database (Neon recommended) # Database (Neon recommended)
DB_HOST=CHANGEME_NEON_HOST DB_HOST=CHANGEME_NEON_HOST
DB_PORT=5432 DB_PORT=5432
POSTGRES_USER=CHANGEME_DB_USER POSTGRES_USER=CHANGEME_DB_USER
POSTGRES_DB=casera POSTGRES_DB=honeydue
DB_SSLMODE=require DB_SSLMODE=require
DB_MAX_OPEN_CONNS=25 DB_MAX_OPEN_CONNS=25
DB_MAX_IDLE_CONNS=10 DB_MAX_IDLE_CONNS=10
@@ -29,13 +29,13 @@ EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587 EMAIL_PORT=587
EMAIL_USE_TLS=true EMAIL_USE_TLS=true
EMAIL_HOST_USER=CHANGEME_EMAIL_USER EMAIL_HOST_USER=CHANGEME_EMAIL_USER
DEFAULT_FROM_EMAIL=Casera <noreply@casera.app> DEFAULT_FROM_EMAIL=honeyDue <noreply@honeyDue.treytartt.com>
# Push notifications # Push notifications
# APNS private key goes in deploy/secrets/apns_auth_key.p8 # APNS private key goes in deploy/secrets/apns_auth_key.p8
APNS_AUTH_KEY_ID=CHANGEME_APNS_KEY_ID APNS_AUTH_KEY_ID=CHANGEME_APNS_KEY_ID
APNS_TEAM_ID=CHANGEME_APNS_TEAM_ID APNS_TEAM_ID=CHANGEME_APNS_TEAM_ID
APNS_TOPIC=com.tt.casera APNS_TOPIC=com.tt.honeyDue
APNS_USE_SANDBOX=false APNS_USE_SANDBOX=false
APNS_PRODUCTION=true APNS_PRODUCTION=true

View File

@@ -140,8 +140,8 @@ source "${PROD_ENV}"
set +a set +a
DEPLOY_MANAGER_SSH_PORT="${DEPLOY_MANAGER_SSH_PORT:-22}" DEPLOY_MANAGER_SSH_PORT="${DEPLOY_MANAGER_SSH_PORT:-22}"
DEPLOY_STACK_NAME="${DEPLOY_STACK_NAME:-casera}" DEPLOY_STACK_NAME="${DEPLOY_STACK_NAME:-honeydue}"
DEPLOY_REMOTE_DIR="${DEPLOY_REMOTE_DIR:-/opt/casera/deploy}" DEPLOY_REMOTE_DIR="${DEPLOY_REMOTE_DIR:-/opt/honeydue/deploy}"
DEPLOY_WAIT_SECONDS="${DEPLOY_WAIT_SECONDS:-420}" DEPLOY_WAIT_SECONDS="${DEPLOY_WAIT_SECONDS:-420}"
DEPLOY_TAG="${DEPLOY_TAG:-$(git -C "${REPO_DIR}" rev-parse --short HEAD)}" DEPLOY_TAG="${DEPLOY_TAG:-$(git -C "${REPO_DIR}" rev-parse --short HEAD)}"
PUSH_LATEST_TAG="${PUSH_LATEST_TAG:-true}" PUSH_LATEST_TAG="${PUSH_LATEST_TAG:-true}"
@@ -183,9 +183,9 @@ if (( app_secret_len < 32 )); then
fi fi
REGISTRY_PREFIX="${REGISTRY%/}/${REGISTRY_NAMESPACE#/}" REGISTRY_PREFIX="${REGISTRY%/}/${REGISTRY_NAMESPACE#/}"
API_IMAGE="${REGISTRY_PREFIX}/casera-api:${DEPLOY_TAG}" API_IMAGE="${REGISTRY_PREFIX}/honeydue-api:${DEPLOY_TAG}"
WORKER_IMAGE="${REGISTRY_PREFIX}/casera-worker:${DEPLOY_TAG}" WORKER_IMAGE="${REGISTRY_PREFIX}/honeydue-worker:${DEPLOY_TAG}"
ADMIN_IMAGE="${REGISTRY_PREFIX}/casera-admin:${DEPLOY_TAG}" ADMIN_IMAGE="${REGISTRY_PREFIX}/honeydue-admin:${DEPLOY_TAG}"
SSH_KEY_PATH="${DEPLOY_SSH_KEY_PATH:-}" SSH_KEY_PATH="${DEPLOY_SSH_KEY_PATH:-}"
if [[ -n "${SSH_KEY_PATH}" ]]; then if [[ -n "${SSH_KEY_PATH}" ]]; then
@@ -232,12 +232,12 @@ if [[ "${SKIP_BUILD}" != "1" ]]; then
if [[ "${PUSH_LATEST_TAG}" == "true" ]]; then if [[ "${PUSH_LATEST_TAG}" == "true" ]]; then
log "Updating :latest tags" log "Updating :latest tags"
docker tag "${API_IMAGE}" "${REGISTRY_PREFIX}/casera-api:latest" docker tag "${API_IMAGE}" "${REGISTRY_PREFIX}/honeydue-api:latest"
docker tag "${WORKER_IMAGE}" "${REGISTRY_PREFIX}/casera-worker:latest" docker tag "${WORKER_IMAGE}" "${REGISTRY_PREFIX}/honeydue-worker:latest"
docker tag "${ADMIN_IMAGE}" "${REGISTRY_PREFIX}/casera-admin:latest" docker tag "${ADMIN_IMAGE}" "${REGISTRY_PREFIX}/honeydue-admin:latest"
docker push "${REGISTRY_PREFIX}/casera-api:latest" docker push "${REGISTRY_PREFIX}/honeydue-api:latest"
docker push "${REGISTRY_PREFIX}/casera-worker:latest" docker push "${REGISTRY_PREFIX}/honeydue-worker:latest"
docker push "${REGISTRY_PREFIX}/casera-admin:latest" docker push "${REGISTRY_PREFIX}/honeydue-admin:latest"
fi fi
else else
warn "SKIP_BUILD=1 set. Using prebuilt images for tag: ${DEPLOY_TAG}" warn "SKIP_BUILD=1 set. Using prebuilt images for tag: ${DEPLOY_TAG}"

View File

@@ -19,7 +19,7 @@ services:
placement: placement:
max_replicas_per_node: 1 max_replicas_per_node: 1
networks: networks:
- casera-network - honeydue-network
api: api:
image: ${API_IMAGE} image: ${API_IMAGE}
@@ -129,7 +129,7 @@ services:
delay: 5s delay: 5s
order: stop-first order: stop-first
networks: networks:
- casera-network - honeydue-network
admin: admin:
image: ${ADMIN_IMAGE} image: ${ADMIN_IMAGE}
@@ -161,7 +161,7 @@ services:
delay: 5s delay: 5s
order: stop-first order: stop-first
networks: networks:
- casera-network - honeydue-network
worker: worker:
image: ${WORKER_IMAGE} image: ${WORKER_IMAGE}
@@ -236,7 +236,7 @@ services:
delay: 5s delay: 5s
order: stop-first order: stop-first
networks: networks:
- casera-network - honeydue-network
dozzle: dozzle:
image: amir20/dozzle:latest image: amir20/dozzle:latest
@@ -258,14 +258,14 @@ services:
constraints: constraints:
- node.role == manager - node.role == manager
networks: networks:
- casera-network - honeydue-network
volumes: volumes:
redis_data: redis_data:
uploads: uploads:
networks: networks:
casera-network: honeydue-network:
driver: overlay driver: overlay
driver_opts: driver_opts:
encrypted: "true" encrypted: "true"

18
dev.sh
View File

@@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
# Development helper script for MyCrib API (Go) # Development helper script for HoneyDue API (Go)
set -e set -e
@@ -67,7 +67,7 @@ case "$1" in
;; ;;
db) db)
echo "🐘 Connecting to PostgreSQL..." 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) redis)
echo "📮 Connecting to Redis..." echo "📮 Connecting to Redis..."
@@ -75,23 +75,23 @@ case "$1" in
;; ;;
seed) seed)
echo "🌱 Seeding lookup data..." 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" echo "✅ Lookup data seeded"
;; ;;
seed-test) seed-test)
echo "🧪 Seeding test data..." 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" echo "✅ Test data seeded"
;; ;;
seed-all) seed-all)
echo "🌱 Seeding all data..." 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:-honeydue} -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/002_test_data.sql
echo "✅ All data seeded" echo "✅ All data seeded"
;; ;;
seed-admin) seed-admin)
echo "🔐 Seeding admin user..." 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" echo "✅ Admin user seeded"
;; ;;
admin-install) admin-install)
@@ -115,7 +115,7 @@ case "$1" in
migrate) migrate)
echo "📊 Running database migrations..." echo "📊 Running database migrations..."
# GORM auto-migrates on API startup, but we need GoAdmin tables # 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" echo "✅ Migrations complete"
;; ;;
clean) clean)
@@ -134,7 +134,7 @@ case "$1" in
echo "🚀 Starting development environment..." echo "🚀 Starting development environment..."
docker-compose $COMPOSE_FILES up docker-compose $COMPOSE_FILES up
else else
echo "Development helper script for MyCrib API (Go)" echo "Development helper script for HoneyDue API (Go)"
echo "" echo ""
echo "Usage: ./dev.sh [command]" echo "Usage: ./dev.sh [command]"
echo "" echo ""

View File

@@ -6,28 +6,28 @@ services:
# PostgreSQL Database # PostgreSQL Database
db: db:
image: postgres:16-alpine image: postgres:16-alpine
container_name: casera-db container_name: honeydue-db
restart: unless-stopped restart: unless-stopped
environment: environment:
POSTGRES_USER: ${POSTGRES_USER:-casera} POSTGRES_USER: ${POSTGRES_USER:-honeydue}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-casera} POSTGRES_DB: ${POSTGRES_DB:-honeydue}
volumes: volumes:
- postgres_data:/var/lib/postgresql/data - postgres_data:/var/lib/postgresql/data
ports: ports:
- "${DB_PORT:-5433}:5432" # 5433 externally to avoid conflicts with local postgres - "${DB_PORT:-5433}:5432" # 5433 externally to avoid conflicts with local postgres
healthcheck: 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 interval: 10s
timeout: 5s timeout: 5s
retries: 5 retries: 5
networks: networks:
- casera-network - honeydue-network
# Redis Cache # Redis Cache
redis: redis:
image: redis:7-alpine image: redis:7-alpine
container_name: casera-redis container_name: honeydue-redis
restart: unless-stopped restart: unless-stopped
command: redis-server --appendonly yes command: redis-server --appendonly yes
volumes: volumes:
@@ -40,14 +40,14 @@ services:
timeout: 5s timeout: 5s
retries: 5 retries: 5
networks: networks:
- casera-network - honeydue-network
# Casera API # honeyDue API
api: api:
build: build:
context: . context: .
target: api target: api
container_name: casera-api container_name: honeydue-api
restart: unless-stopped restart: unless-stopped
ports: ports:
- "${PORT:-8000}:8000" - "${PORT:-8000}:8000"
@@ -61,9 +61,9 @@ services:
# Database # Database
DB_HOST: db DB_HOST: db
DB_PORT: "5432" DB_PORT: "5432"
POSTGRES_USER: ${POSTGRES_USER:-casera} POSTGRES_USER: ${POSTGRES_USER:-honeydue}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-casera} POSTGRES_DB: ${POSTGRES_DB:-honeydue}
DB_SSLMODE: "disable" DB_SSLMODE: "disable"
# Redis # Redis
@@ -77,14 +77,14 @@ services:
EMAIL_PORT: ${EMAIL_PORT:-587} EMAIL_PORT: ${EMAIL_PORT:-587}
EMAIL_HOST_USER: ${EMAIL_HOST_USER} EMAIL_HOST_USER: ${EMAIL_HOST_USER}
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} 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" EMAIL_USE_TLS: "true"
# Push Notifications # Push Notifications
APNS_AUTH_KEY_PATH: ${APNS_AUTH_KEY_PATH} APNS_AUTH_KEY_PATH: ${APNS_AUTH_KEY_PATH}
APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID} APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID}
APNS_TEAM_ID: ${APNS_TEAM_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" APNS_USE_SANDBOX: "true"
FCM_SERVER_KEY: ${FCM_SERVER_KEY} FCM_SERVER_KEY: ${FCM_SERVER_KEY}
volumes: volumes:
@@ -102,14 +102,14 @@ services:
start_period: 10s start_period: 10s
retries: 3 retries: 3
networks: networks:
- casera-network - honeydue-network
# Casera Admin Panel (Next.js) # honeyDue Admin Panel (Next.js)
admin: admin:
build: build:
context: . context: .
target: admin target: admin
container_name: casera-admin container_name: honeydue-admin
restart: unless-stopped restart: unless-stopped
ports: ports:
- "${ADMIN_PORT:-3000}:3000" - "${ADMIN_PORT:-3000}:3000"
@@ -126,22 +126,22 @@ services:
timeout: 10s timeout: 10s
retries: 3 retries: 3
networks: networks:
- casera-network - honeydue-network
# Casera Worker (Background Jobs) # honeyDue Worker (Background Jobs)
worker: worker:
build: build:
context: . context: .
target: worker target: worker
container_name: casera-worker container_name: honeydue-worker
restart: unless-stopped restart: unless-stopped
environment: environment:
# Database # Database
DB_HOST: db DB_HOST: db
DB_PORT: "5432" DB_PORT: "5432"
POSTGRES_USER: ${POSTGRES_USER:-casera} POSTGRES_USER: ${POSTGRES_USER:-honeydue}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-casera_dev_password} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-honeydue_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-casera} POSTGRES_DB: ${POSTGRES_DB:-honeydue}
DB_SSLMODE: "disable" DB_SSLMODE: "disable"
# Redis # Redis
@@ -154,7 +154,7 @@ services:
APNS_AUTH_KEY_PATH: "/certs/apns_key.p8" APNS_AUTH_KEY_PATH: "/certs/apns_key.p8"
APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID} APNS_AUTH_KEY_ID: ${APNS_AUTH_KEY_ID}
APNS_TEAM_ID: ${APNS_TEAM_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" APNS_USE_SANDBOX: "true"
FCM_SERVER_KEY: ${FCM_SERVER_KEY} FCM_SERVER_KEY: ${FCM_SERVER_KEY}
@@ -163,7 +163,7 @@ services:
EMAIL_PORT: ${EMAIL_PORT:-587} EMAIL_PORT: ${EMAIL_PORT:-587}
EMAIL_HOST_USER: ${EMAIL_HOST_USER} EMAIL_HOST_USER: ${EMAIL_HOST_USER}
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} 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" EMAIL_USE_TLS: "true"
# Worker settings (UTC hours for scheduled jobs) # Worker settings (UTC hours for scheduled jobs)
@@ -178,12 +178,12 @@ services:
redis: redis:
condition: service_healthy condition: service_healthy
networks: networks:
- casera-network - honeydue-network
# Dozzle — lightweight real-time log viewer # Dozzle — lightweight real-time log viewer
dozzle: dozzle:
image: amir20/dozzle:latest image: amir20/dozzle:latest
container_name: casera-dozzle container_name: honeydue-dozzle
restart: unless-stopped restart: unless-stopped
ports: ports:
- "${DOZZLE_PORT:-9999}:8080" - "${DOZZLE_PORT:-9999}:8080"
@@ -192,12 +192,12 @@ services:
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
networks: networks:
- casera-network - honeydue-network
volumes: volumes:
postgres_data: postgres_data:
redis_data: redis_data:
networks: networks:
casera-network: honeydue-network:
driver: bridge driver: bridge

View File

@@ -1,6 +1,6 @@
# Production / Docker Swarm compose file # Production / Docker Swarm compose file
# Usage: # 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. # All env vars must be set in the environment or a .env file.
# No dev-safe defaults — missing vars will fail the deploy. # No dev-safe defaults — missing vars will fail the deploy.
@@ -30,7 +30,7 @@ services:
parallelism: 1 parallelism: 1
delay: 10s delay: 10s
networks: networks:
- casera-network - honeydue-network
# Redis Cache # Redis Cache
redis: redis:
@@ -50,11 +50,11 @@ services:
condition: any condition: any
delay: 5s delay: 5s
networks: networks:
- casera-network - honeydue-network
# Casera API # honeyDue API
api: api:
image: ${REGISTRY:-ghcr.io/treytartt}/casera-api:${TAG:-latest} image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-api:${TAG:-latest}
ports: ports:
- "${PORT:-8000}:8000" - "${PORT:-8000}:8000"
environment: environment:
@@ -113,11 +113,11 @@ services:
delay: 10s delay: 10s
order: start-first order: start-first
networks: networks:
- casera-network - honeydue-network
# Casera Admin Panel (Next.js) # honeyDue Admin Panel (Next.js)
admin: admin:
image: ${REGISTRY:-ghcr.io/treytartt}/casera-admin:${TAG:-latest} image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-admin:${TAG:-latest}
ports: ports:
- "${ADMIN_PORT:-3000}:3000" - "${ADMIN_PORT:-3000}:3000"
environment: environment:
@@ -139,11 +139,11 @@ services:
delay: 10s delay: 10s
order: start-first order: start-first
networks: networks:
- casera-network - honeydue-network
# Casera Worker (Background Jobs) # honeyDue Worker (Background Jobs)
worker: worker:
image: ${REGISTRY:-ghcr.io/treytartt}/casera-worker:${TAG:-latest} image: ${REGISTRY:-ghcr.io/treytartt}/honeydue-worker:${TAG:-latest}
environment: environment:
# Database # Database
DB_HOST: db DB_HOST: db
@@ -187,7 +187,7 @@ services:
condition: any condition: any
delay: 5s delay: 5s
networks: networks:
- casera-network - honeydue-network
# Dozzle — lightweight real-time log viewer # Dozzle — lightweight real-time log viewer
dozzle: dozzle:
@@ -207,7 +207,7 @@ services:
constraints: constraints:
- node.role == manager - node.role == manager
networks: networks:
- casera-network - honeydue-network
volumes: volumes:
postgres_data: postgres_data:
@@ -216,5 +216,5 @@ volumes:
uploads: uploads:
networks: networks:
casera-network: honeydue-network:
driver: overlay driver: overlay

View File

@@ -1,7 +1,7 @@
# MyCrib Go Backend — Deep Audit Findings # HoneyDue Go Backend — Deep Audit Findings
**Date**: 2026-03-01 **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 **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 ### SEC-04 | CRITICAL | Next.js admin password reset to "admin123" on every migration
- **File**: `internal/database/database.go:447-463` - **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. - **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 ### 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 ### AUTH-06 | CRITICAL | Hardcoded admin credentials reset on every migration
- **File**: `internal/database/database.go:372-382,447-463` - **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. - **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 ### 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 ### DATA-07 | CRITICAL | Next.js admin password reset on every migration run
- **File**: `internal/database/database.go:458-463` - **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. - **Impact**: Same persistent backdoor.
### DATA-08 | BUG | GetAllUsers/HasAccess silently wrong when associations not preloaded ### DATA-08 | BUG | GetAllUsers/HasAccess silently wrong when associations not preloaded

View File

@@ -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 ## Table of Contents
@@ -90,7 +90,7 @@ sudo DOKKU_TAG=v0.34.4 bash bootstrap.sh
```bash ```bash
# Set your domain (replace with your actual domain) # 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 # Add your SSH public key for deployments
# Run this from your LOCAL machine: # 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 ### 1. Create the Dokku App
```bash ```bash
dokku apps:create casera-api dokku apps:create honeydue-api
``` ```
### 2. Set the Domain ### 2. Set the Domain
```bash ```bash
dokku domains:add casera-api api.casera.treytartt.com dokku domains:add honeydue-api api.honeyDue.treytartt.com
``` ```
### 3. Configure Buildpack (if needed) ### 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: The app uses a Dockerfile, so Dokku will auto-detect it. If you need to force Docker builds:
```bash ```bash
dokku builder:set casera-api build-dir . dokku builder:set honeydue-api build-dir .
dokku builder-dockerfile:set casera-api dockerfile-path Dockerfile dokku builder-dockerfile:set honeydue-api dockerfile-path Dockerfile
``` ```
--- ---
@@ -143,20 +143,20 @@ dokku builder-dockerfile:set casera-api dockerfile-path Dockerfile
```bash ```bash
# Create the database service # Create the database service
dokku postgres:create casera-db dokku postgres:create honeydue-db
# Link to the app (automatically sets DATABASE_URL) # 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 ### 2. Verify Connection
```bash ```bash
# Check the connection info # Check the connection info
dokku postgres:info casera-db dokku postgres:info honeydue-db
# Connect to the database # Connect to the database
dokku postgres:connect casera-db dokku postgres:connect honeydue-db
``` ```
### 3. Set Individual Database Variables ### 3. Set Individual Database Variables
@@ -165,13 +165,13 @@ Dokku sets `DATABASE_URL` automatically, but the app expects individual variable
```bash ```bash
# Get the database credentials # Get the database credentials
dokku postgres:info casera-db dokku postgres:info honeydue-db
# Set individual variables (replace with actual values from info command) # Set individual variables (replace with actual values from info command)
dokku config:set casera-api \ dokku config:set honeydue-api \
DB_HOST=dokku-postgres-casera-db \ DB_HOST=dokku-postgres-honeydue-db \
DB_PORT=5432 \ DB_PORT=5432 \
POSTGRES_DB=casera_db \ POSTGRES_DB=honeydue_db \
POSTGRES_USER=postgres \ POSTGRES_USER=postgres \
POSTGRES_PASSWORD=1mJPfu6rzG9r6xukcGbUOU5NoCg0jKfa POSTGRES_PASSWORD=1mJPfu6rzG9r6xukcGbUOU5NoCg0jKfa
``` ```
@@ -184,16 +184,16 @@ dokku config:set casera-api \
```bash ```bash
# Create the Redis service # Create the Redis service
dokku redis:create casera-redis dokku redis:create honeydue-redis
# Link to the app (automatically sets REDIS_URL) # 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 ### 2. Verify Connection
```bash ```bash
dokku redis:info casera-redis dokku redis:info honeydue-redis
``` ```
--- ---
@@ -203,10 +203,10 @@ dokku redis:info casera-redis
### 1. Required Variables ### 1. Required Variables
```bash ```bash
dokku config:set casera-api \ dokku config:set honeydue-api \
PORT=5000 \ PORT=5000 \
DEBUG=false \ DEBUG=false \
ALLOWED_HOSTS=api.casera.treytartt.com,localhost \ ALLOWED_HOSTS=api.honeyDue.treytartt.com,localhost \
TIMEZONE=UTC \ TIMEZONE=UTC \
SECRET_KEY=8553813eda361017a02677ed504abdd331537cfe6f7cc407345f037cc22c75fc SECRET_KEY=8553813eda361017a02677ed504abdd331537cfe6f7cc407345f037cc22c75fc
``` ```
@@ -214,20 +214,20 @@ dokku config:set casera-api \
### 2. Email Configuration ### 2. Email Configuration
```bash ```bash
dokku config:set casera-api \ dokku config:set honeydue-api \
EMAIL_HOST=smtp.fastmail.com \ EMAIL_HOST=smtp.fastmail.com \
EMAIL_PORT=587 \ EMAIL_PORT=587 \
EMAIL_USE_TLS=true \ EMAIL_USE_TLS=true \
EMAIL_HOST_USER=treytartt@fastmail.com \ EMAIL_HOST_USER=treytartt@fastmail.com \
EMAIL_HOST_PASSWORD=2t9y4n4t497z5863 \ EMAIL_HOST_PASSWORD=2t9y4n4t497z5863 \
DEFAULT_FROM_EMAIL="Casera <treytartt@fastmail.com>" DEFAULT_FROM_EMAIL="honeyDue <treytartt@fastmail.com>"
``` ```
### 3. Apple Sign In (Optional) ### 3. Apple Sign In (Optional)
```bash ```bash
dokku config:set casera-api \ dokku config:set honeydue-api \
APPLE_CLIENT_ID=com.tt.casera.CaseraDev \ APPLE_CLIENT_ID=com.tt.honeyDue.honeyDueDev \
APPLE_TEAM_ID=V3PF3M6B6U 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): The API uses direct APNs/FCM connections (no external push server needed):
```bash ```bash
dokku config:set casera-api \ dokku config:set honeydue-api \
APNS_AUTH_KEY_PATH=/push_certs/AuthKey_R9N3SM2WD5.p8 \ APNS_AUTH_KEY_PATH=/push_certs/AuthKey_R9N3SM2WD5.p8 \
APNS_AUTH_KEY_ID=R9N3SM2WD5 \ APNS_AUTH_KEY_ID=R9N3SM2WD5 \
APNS_TEAM_ID=V3PF3M6B6U \ APNS_TEAM_ID=V3PF3M6B6U \
APNS_TOPIC=com.tt.casera.CaseraDev \ APNS_TOPIC=com.tt.honeyDue.honeyDueDev \
APNS_PRODUCTION=true \ APNS_PRODUCTION=true \
FCM_SERVER_KEY=your-firebase-server-key FCM_SERVER_KEY=your-firebase-server-key
``` ```
@@ -248,14 +248,14 @@ dokku config:set casera-api \
### 5. Admin Panel URL ### 5. Admin Panel URL
```bash ```bash
dokku config:set casera-api \ dokku config:set honeydue-api \
NEXT_PUBLIC_API_URL=https://api.casera.treytartt.com NEXT_PUBLIC_API_URL=https://api.honeyDue.treytartt.com
``` ```
### 6. View All Configuration ### 6. View All Configuration
```bash ```bash
dokku config:show casera-api dokku config:show honeydue-api
``` ```
--- ---
@@ -266,16 +266,16 @@ dokku config:show casera-api
```bash ```bash
# Create storage directory on host # 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 # 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 ### 2. Mount Storage to App
```bash ```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) ### 1. Add Dokku Remote (Local Machine)
```bash ```bash
cd /path/to/myCribAPI-go cd /path/to/honeyDueAPI-go
git remote add dokku dokku@your-server-ip:casera-api git remote add dokku dokku@your-server-ip:honeydue-api
``` ```
### 2. Deploy ### 2. Deploy
@@ -301,17 +301,17 @@ git push dokku main
```bash ```bash
# On server # On server
dokku logs casera-api -t dokku logs honeydue-api -t
``` ```
### 4. Verify Deployment ### 4. Verify Deployment
```bash ```bash
# Check app status # Check app status
dokku ps:report casera-api dokku ps:report honeydue-api
# Check app is running # 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 ### 1. Set Let's Encrypt Email
```bash ```bash
dokku letsencrypt:set casera-api email admin@treytartt.com dokku letsencrypt:set honeydue-api email admin@treytartt.com
``` ```
### 2. Enable Let's Encrypt ### 2. Enable Let's Encrypt
```bash ```bash
dokku letsencrypt:enable casera-api dokku letsencrypt:enable honeydue-api
``` ```
### 3. Set Up Auto-Renewal ### 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 ### 1. Configure Worker Environment Variables
```bash ```bash
dokku config:set casera-api \ dokku config:set honeydue-api \
TASK_REMINDER_HOUR=20 \ TASK_REMINDER_HOUR=20 \
TASK_REMINDER_MINUTE=0 \ TASK_REMINDER_MINUTE=0 \
OVERDUE_REMINDER_HOUR=9 \ OVERDUE_REMINDER_HOUR=9 \
@@ -364,17 +364,17 @@ dokku config:set casera-api \
```bash ```bash
# Scale to 1 worker # Scale to 1 worker
dokku ps:scale casera-api worker=1 dokku ps:scale honeydue-api worker=1
# Verify processes # Verify processes
dokku ps:report casera-api dokku ps:report honeydue-api
``` ```
### 3. Verify Worker is Running ### 3. Verify Worker is Running
```bash ```bash
# Check worker logs # Check worker logs
dokku logs casera-api -p worker dokku logs honeydue-api -p worker
# Should see: # Should see:
# "Registered task reminder job" # "Registered task reminder job"
@@ -391,33 +391,33 @@ dokku logs casera-api -p worker
```bash ```bash
# Real-time logs # Real-time logs
dokku logs casera-api -t dokku logs honeydue-api -t
# Last 100 lines # Last 100 lines
dokku logs casera-api -n 100 dokku logs honeydue-api -n 100
# Worker logs # Worker logs
dokku logs casera-api -p worker dokku logs honeydue-api -p worker
``` ```
### Database Operations ### Database Operations
```bash ```bash
# Connect to database # Connect to database
dokku postgres:connect casera-db dokku postgres:connect honeydue-db
# Export database backup # Export database backup
dokku postgres:export casera-db > backup.sql dokku postgres:export honeydue-db > backup.sql
# Import database backup # Import database backup
dokku postgres:import casera-db < backup.sql dokku postgres:import honeydue-db < backup.sql
``` ```
### Run Migrations Manually ### Run Migrations Manually
```bash ```bash
# Enter the app container # Enter the app container
dokku enter casera-api web dokku enter honeydue-api web
# Migrations run automatically on startup, but if needed: # Migrations run automatically on startup, but if needed:
/app/api migrate /app/api migrate
@@ -426,24 +426,24 @@ dokku enter casera-api web
### Restart App ### Restart App
```bash ```bash
dokku ps:restart casera-api dokku ps:restart honeydue-api
``` ```
### Scale App ### Scale App
```bash ```bash
# Scale web process # Scale web process
dokku ps:scale casera-api web=2 worker=1 dokku ps:scale honeydue-api web=2 worker=1
# View current scale # View current scale
dokku ps:report casera-api dokku ps:report honeydue-api
``` ```
### Stop/Start App ### Stop/Start App
```bash ```bash
dokku ps:stop casera-api dokku ps:stop honeydue-api
dokku ps:start casera-api dokku ps:start honeydue-api
``` ```
--- ---
@@ -453,8 +453,8 @@ dokku ps:start casera-api
### Check App Status ### Check App Status
```bash ```bash
dokku ps:report casera-api dokku ps:report honeydue-api
dokku logs casera-api -n 200 dokku logs honeydue-api -n 200
``` ```
### Common Issues ### Common Issues
@@ -463,47 +463,47 @@ dokku logs casera-api -n 200
```bash ```bash
# Check logs for errors # Check logs for errors
dokku logs casera-api -n 500 dokku logs honeydue-api -n 500
# Verify environment variables # Verify environment variables
dokku config:show casera-api dokku config:show honeydue-api
# Check if ports are available # Check if ports are available
dokku proxy:ports casera-api dokku proxy:ports honeydue-api
``` ```
#### 2. Database Connection Failed #### 2. Database Connection Failed
```bash ```bash
# Verify link # Verify link
dokku postgres:linked casera-api casera-db dokku postgres:linked honeydue-api honeydue-db
# Check database is running # Check database is running
dokku postgres:info casera-db dokku postgres:info honeydue-db
# Re-link if needed # Re-link if needed
dokku postgres:unlink casera-db casera-api dokku postgres:unlink honeydue-db honeydue-api
dokku postgres:link casera-db casera-api dokku postgres:link honeydue-db honeydue-api
``` ```
#### 3. Redis Connection Failed #### 3. Redis Connection Failed
```bash ```bash
# Verify link # Verify link
dokku redis:linked casera-api casera-redis dokku redis:linked honeydue-api honeydue-redis
# Check Redis is running # Check Redis is running
dokku redis:info casera-redis dokku redis:info honeydue-redis
``` ```
#### 4. Storage/Upload Issues #### 4. Storage/Upload Issues
```bash ```bash
# Check mounts # Check mounts
dokku storage:report casera-api dokku storage:report honeydue-api
# Verify permissions # Verify permissions
ls -la /var/lib/dokku/data/storage/casera-api/ ls -la /var/lib/dokku/data/storage/honeydue-api/
``` ```
#### 5. SSL Certificate Issues #### 5. SSL Certificate Issues
@@ -513,7 +513,7 @@ ls -la /var/lib/dokku/data/storage/casera-api/
dokku letsencrypt:list dokku letsencrypt:list
# Renew manually # Renew manually
dokku letsencrypt:enable casera-api dokku letsencrypt:enable honeydue-api
``` ```
### View Resource Usage ### View Resource Usage
@@ -523,7 +523,7 @@ dokku letsencrypt:enable casera-api
docker stats docker stats
# Disk usage # Disk usage
dokku storage:report casera-api dokku storage:report honeydue-api
df -h df -h
``` ```
@@ -534,12 +534,12 @@ df -h
| Command | Description | | Command | Description |
|---------|-------------| |---------|-------------|
| `dokku apps:list` | List all apps | | `dokku apps:list` | List all apps |
| `dokku logs casera-api -t` | Tail logs | | `dokku logs honeydue-api -t` | Tail logs |
| `dokku ps:restart casera-api` | Restart app | | `dokku ps:restart honeydue-api` | Restart app |
| `dokku config:show casera-api` | Show env vars | | `dokku config:show honeydue-api` | Show env vars |
| `dokku postgres:connect casera-db` | Connect to DB | | `dokku postgres:connect honeydue-db` | Connect to DB |
| `dokku enter casera-api web` | Shell into container | | `dokku enter honeydue-api web` | Shell into container |
| `dokku ps:scale casera-api web=2` | Scale processes | | `dokku ps:scale honeydue-api web=2` | Scale processes |
--- ---

View File

@@ -1,6 +1,6 @@
# Go To Prod Plan # 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. Execute phases in order. Do not skip exit criteria.
## How To Use This Plan ## How To Use This Plan
@@ -15,12 +15,12 @@ Goal: eliminate known repo/config drift before hardening.
### Tasks ### Tasks
1. Fix stale admin build/run targets in [`Makefile`](/Users/treyt/Desktop/code/MyCribAPI_GO/Makefile) that reference `cmd/admin` (non-existent). 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/MyCribAPI_GO/docker-compose.yml) with Go config: 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 `TASK_REMINDER_HOUR`
- use `OVERDUE_REMINDER_HOUR` - use `OVERDUE_REMINDER_HOUR`
- use `DAILY_DIGEST_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. 4. Remove any committed secrets/keys from repo and history; rotate immediately.
### Validation ### Validation
@@ -42,7 +42,7 @@ Goal: block regressions by policy.
### Tasks ### 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 .`) - `lint` (`go vet ./...`, `gofmt -l .`)
- `test` (`go test -race -count=1 ./...`) - `test` (`go test -race -count=1 ./...`)
- `contract` (`go test -v -run "TestRouteSpecContract|TestKMPSpecContract" ./internal/integration/`) - `contract` (`go test -v -run "TestRouteSpecContract|TestKMPSpecContract" ./internal/integration/`)
@@ -72,7 +72,7 @@ Goal: guarantee deploy safety for API behavior and schema changes.
### Tasks ### 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. 2. Require route/schema updates in same PR as handler changes.
3. Add migration checks in CI: 3. Add migration checks in CI:
- migrate up on clean DB - migrate up on clean DB
@@ -166,7 +166,7 @@ Goal: make production behavior measurable and actionable.
- queue depth/retry spikes - queue depth/retry spikes
- DB latency - DB latency
4. Add dead-letter queue review and replay procedure. 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 - DB outage
- Redis outage - Redis outage
- push provider outage - push provider outage

View File

@@ -1,8 +1,8 @@
# Full Localization Plan for Casera # Full Localization Plan for honeyDue
## Overview ## 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 - **Go API** - Server-side localization of errors, emails, push notifications, lookup data
- **KMM/Android** - Compose Multiplatform string resources - **KMM/Android** - Compose Multiplatform string resources
- **iOS** - Apple String Catalogs (.xcstrings) - **iOS** - Apple String Catalogs (.xcstrings)
@@ -28,7 +28,7 @@ go get github.com/nicksnyder/go-i18n/v2
### 1.2 Directory Structure ### 1.2 Directory Structure
``` ```
myCribAPI-go/ honeyDueAPI-go/
├── internal/ ├── internal/
│ └── i18n/ │ └── i18n/
│ ├── i18n.go # Core setup, bundle, T() helper │ ├── 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 ### 2.2 Directory Structure
``` ```
MyCribKMM/composeApp/src/commonMain/ HoneyDueKMM/composeApp/src/commonMain/
└── composeResources/ └── composeResources/
├── values/ ├── values/
│ └── strings.xml # English (base) │ └── strings.xml # English (base)
@@ -195,8 +195,8 @@ MyCribKMM/composeApp/src/commonMain/
### 2.4 Usage in Compose ### 2.4 Usage in Compose
```kotlin ```kotlin
import casera.composeapp.generated.resources.Res import honeydue.composeapp.generated.resources.Res
import casera.composeapp.generated.resources.* import honeydue.composeapp.generated.resources.*
import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.stringResource
@Composable @Composable

View File

@@ -1,10 +1,10 @@
# Push Notifications Architecture # 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 ## 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) - Reduces infrastructure complexity (no Gorush or other push server needed)
- Provides direct control over notification payloads - 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_PATH` | For iOS | Path to .p8 key file |
| `APNS_AUTH_KEY_ID` | For iOS | Key ID from Apple Developer | | `APNS_AUTH_KEY_ID` | For iOS | Key ID from Apple Developer |
| `APNS_TEAM_ID` | For iOS | Team 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_PRODUCTION` | No | `true` for production, `false` for sandbox |
| `APNS_USE_SANDBOX` | No | Deprecated, use `APNS_PRODUCTION` | | `APNS_USE_SANDBOX` | No | Deprecated, use `APNS_PRODUCTION` |
| `FCM_SERVER_KEY` | For Android | Firebase Cloud Messaging server key | | `FCM_SERVER_KEY` | For Android | Firebase Cloud Messaging server key |
@@ -168,7 +168,7 @@ volumes:
- ./push_certs:/certs:ro - ./push_certs:/certs:ro
# Dokku # Dokku
dokku storage:mount casera-api /path/to/push_certs:/certs dokku storage:mount honeydue-api /path/to/push_certs:/certs
``` ```
## Data Flow ## Data Flow
@@ -263,7 +263,7 @@ log.Info().
docker-compose logs -f worker docker-compose logs -f worker
# Dokku # Dokku
dokku logs casera-api -p worker dokku logs honeydue-api -p worker
``` ```
### Test Push Manually ### Test Push Manually

View File

@@ -192,7 +192,7 @@ suspend fun fetchMedia(mediaUrl: String): ByteArray {
## Files to Modify ## Files to Modify
### Go API (myCribAPI-go) ### Go API (honeyDueAPI-go)
| File | Change | | File | Change |
|------|--------| |------|--------|
@@ -203,7 +203,7 @@ suspend fun fetchMedia(mediaUrl: String): ByteArray {
| `/internal/services/document_service.go` | Update to generate proxy URLs | | `/internal/services/document_service.go` | Update to generate proxy URLs |
| `/internal/services/task_service.go` | Update to generate proxy URLs for completions | | `/internal/services/task_service.go` | Update to generate proxy URLs for completions |
### iOS (MyCribKMM/iosApp) ### iOS (HoneyDueKMM/iosApp)
| File | Change | | File | Change |
|------|--------| |------|--------|

View File

@@ -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) 1. Go to [App Store Connect > Users and Access > Keys](https://appstoreconnect.apple.com/access/api)
2. Click **Generate API Key** 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) 4. Select **App Manager** role (minimum required for IAP)
5. Download the `.p8` file - **you can only download it once!** 5. Download the `.p8` file - **you can only download it once!**
6. Note the **Key ID** and **Issuer ID** 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) 2. Select your project (or create one)
3. Navigate to **Pub/Sub** > **Topics** 3. Navigate to **Pub/Sub** > **Topics**
4. Click **Create Topic** 4. Click **Create Topic**
5. Name it (e.g., `casera-subscriptions`) 5. Name it (e.g., `honeydue-subscriptions`)
6. Note the full topic name: `projects/your-project-id/topics/casera-subscriptions` 6. Note the full topic name: `projects/your-project-id/topics/honeydue-subscriptions`
### 2. Create a Push Subscription ### 2. Create a Push Subscription
1. In the Pub/Sub Topics list, click on your topic 1. In the Pub/Sub Topics list, click on your topic
2. Click **Create Subscription** 2. Click **Create Subscription**
3. Configure: 3. Configure:
- **Subscription ID**: `casera-subscription-webhook` - **Subscription ID**: `honeydue-subscription-webhook`
- **Delivery type**: Push - **Delivery type**: Push
- **Endpoint URL**: `https://your-domain.com/api/subscription/webhook/google/` - **Endpoint URL**: `https://your-domain.com/api/subscription/webhook/google/`
- **Acknowledgment deadline**: 60 seconds - **Acknowledgment deadline**: 60 seconds
@@ -100,7 +100,7 @@ Google uses Cloud Pub/Sub to deliver subscription notifications. Setup requires
2. Select your app 2. Select your app
3. Navigate to **Monetization** > **Monetization setup** 3. Navigate to **Monetization** > **Monetization setup**
4. Under **Real-time developer notifications**: 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** 5. Click **Save**
6. Click **Send test notification** to verify the connection 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) 1. Go to [Google Cloud Console > IAM & Admin > Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts)
2. Click **Create Service Account** 2. Click **Create Service Account**
3. Name it (e.g., `casera-iap-validator`) 3. Name it (e.g., `honeydue-iap-validator`)
4. Grant roles: 4. Grant roles:
- `Pub/Sub Subscriber` (for webhook handling) - `Pub/Sub Subscriber` (for webhook handling)
5. Click **Done** 5. Click **Done**

View File

@@ -1,6 +1,6 @@
# Task Kanban Categorization # 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 > Note: The categorization chain still computes `cancelled_tasks`, but the kanban board response
> intentionally hides cancelled/archived tasks and returns only 5 visible columns. > 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 ### Basic Categorization
```go ```go
import "github.com/treytartt/casera-api/internal/task/categorization" import "github.com/treytartt/honeydue-api/internal/task/categorization"
task := &models.Task{ task := &models.Task{
DueDate: time.Now().AddDate(0, 0, 15), // 15 days from now DueDate: time.Now().AddDate(0, 0, 15), // 15 days from now

View File

@@ -1,6 +1,6 @@
# Task Kanban Board Categorization Logic # 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 > 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`). > hidden from board responses (though task-level `kanban_column` may still be `cancelled_tasks`).

View File

@@ -22,7 +22,7 @@ internal/task/
Pure Go functions that define task logic. These are the **canonical definitions** for all task states. Pure Go functions that define task logic. These are the **canonical definitions** for all task states.
```go ```go
import "github.com/treytartt/casera-api/internal/task/predicates" import "github.com/treytartt/honeydue-api/internal/task/predicates"
// State checks // State checks
predicates.IsCompleted(task) // NextDueDate == nil && len(Completions) > 0 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. 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 ```go
import "github.com/treytartt/casera-api/internal/task/scopes" import "github.com/treytartt/honeydue-api/internal/task/scopes"
// State scopes // State scopes
db.Scopes(scopes.ScopeActive) // is_cancelled = false AND is_archived = false 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. Determines which kanban column a task belongs to. Uses predicates internally.
```go ```go
import "github.com/treytartt/casera-api/internal/task/categorization" import "github.com/treytartt/honeydue-api/internal/task/categorization"
// Single task // Single task
column := categorization.CategorizeTask(task, 30) 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: For most use cases, import the main task package which re-exports everything:
```go ```go
import "github.com/treytartt/casera-api/internal/task" import "github.com/treytartt/honeydue-api/internal/task"
// Use predicates // Use predicates
if task.IsCompleted(t) { ... } if task.IsCompleted(t) { ... }
@@ -344,7 +344,7 @@ predicates.IsInProgress(task) // Checks task.InProgress boolean
For most files, use the convenience re-exports: For most files, use the convenience re-exports:
```go ```go
import "github.com/treytartt/casera-api/internal/task" import "github.com/treytartt/honeydue-api/internal/task"
// Then use: // Then use:
task.IsCompleted(t) task.IsCompleted(t)
@@ -355,8 +355,8 @@ task.CategorizeTask(t, 30)
For files that only need predicates or only need scopes: For files that only need predicates or only need scopes:
```go ```go
import "github.com/treytartt/casera-api/internal/task/predicates" import "github.com/treytartt/honeydue-api/internal/task/predicates"
import "github.com/treytartt/casera-api/internal/task/scopes" import "github.com/treytartt/honeydue-api/internal/task/scopes"
``` ```
## Related Documentation ## Related Documentation

View File

@@ -2,7 +2,7 @@
*Last Updated: December 2024* *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 | | 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 | | **HomeZada** | Yes | Yes (Deluxe) | Yes | No | Yes | Free / $59-99/yr |
| **Centriq** | Reminders only | Yes | Yes (Manuals) | No | Yes + Recalls | Free / $18-100/yr | | **Centriq** | Reminders only | Yes | Yes (Manuals) | No | Yes + Recalls | Free / $18-100/yr |
| **Homer** | Yes | Yes | Yes | Contacts only | Yes | Free / Premium | | **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 ## 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 1. **Contractor Management** - Most competitors lack this entirely
2. **Kanban Task View** - Unique visual organization (overdue, due soon, upcoming, completed) 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 4. **Combined Approach** - Tasks + Documents + Contractors + Warranties in one app
5. **Recurring Task Intelligence** - Smart next-due-date calculation for recurring maintenance 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 | | Contractor database | All except Homer (contacts only) | Full contractor profiles with specialties |
| Kanban visualization | All | Visual task board with columns | | Kanban visualization | All | Visual task board with columns |
@@ -229,12 +229,12 @@ Based on market analysis:
### Competitive Price Points ### Competitive Price Points
| Competitor | Annual Price | Casera Comparison | | Competitor | Annual Price | honeyDue Comparison |
|------------|--------------|-------------------| |------------|--------------|-------------------|
| Tody | $6 | Casera offers much more (not just cleaning) | | Tody | $6 | honeyDue offers much more (not just cleaning) |
| Sweepy | $15-17 | Casera offers full home management | | Sweepy | $15-17 | honeyDue offers full home management |
| Centriq | $18-100 | Casera has better task management | | Centriq | $18-100 | honeyDue has better task management |
| HomeZada | $59-149 | Casera adds contractors, better UX | | HomeZada | $59-149 | honeyDue adds contractors, better UX |
--- ---

View File

@@ -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* *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. 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. 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** **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** **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. 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 ### 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 | | **Price** | Free with premium tiers |
| **Headquarters** | [CITY, STATE] | | **Headquarters** | [CITY, STATE] |
| **Website** | [URL] | | **Website** | [URL] |
| **Social** | @CaseraApp | | **Social** | @honeyDueApp |
--- ---
@@ -94,7 +94,7 @@ High-resolution logos, app screenshots, and founder headshots are available at:
Hi [Name], 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. **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 ## 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. Free on iOS + Android.
@@ -129,10 +129,10 @@ Your home runs better when you do. 🏠
*Choose the one that fits your story best:* *Choose the one that fits your story best:*
**Problem-focused:** **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:** **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:** **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." > "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? 1. What's the most commonly forgotten home maintenance task?
2. How much can preventive maintenance actually save homeowners? 2. How much can preventive maintenance actually save homeowners?
3. Why hasn't this problem been solved before? 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? 5. What's the most surprising thing you've learned from users?
--- ---
## Boilerplate ## Boilerplate
**About Casera (50 words)** **About honeyDue (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. 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)** **About honeyDue (25 words)**
Casera is a home maintenance app that helps homeowners track tasks, store warranties, and organize contractor info — all in one place. 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)** **About honeyDue (10 words)**
Casera: The organized way to manage home maintenance. honeyDue: The organized way to manage home maintenance.
--- ---
@@ -195,6 +195,6 @@ Casera: The organized way to manage home maintenance.
**General Information:** **General Information:**
Website: [URL] Website: [URL]
Email: hello@casera.app Email: hello@honeyDue.treytartt.com
Twitter: @CaseraApp Twitter: @honeyDueApp
Instagram: @CaseraApp Instagram: @honeyDueApp

View File

@@ -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** **Post 1 - Main Launch**
``` ```
Introducing Casera 🏠 Introducing honeyDue 🏠
The home maintenance app that actually makes sense. 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? 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. Set it once. Get reminded forever.
@@ -56,7 +56,7 @@ POV: You need a plumber at 9pm
❌ Googling "plumber near me" again ❌ Googling "plumber near me" again
❌ Hoping you saved that business card ❌ 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. 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. 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] Smart home maintenance → [link]
``` ```
@@ -87,7 +87,7 @@ Finally, a way to actually SEE your home maintenance:
🟢 Upcoming — you're ahead of the game 🟢 Upcoming — you're ahead of the game
✅ Completed — feel that satisfaction ✅ Completed — feel that satisfaction
Casera's kanban view. Simple. Visual. Effective. honeyDue's kanban view. Simple. Visual. Effective.
``` ```
**Document Storage** **Document Storage**
@@ -97,7 +97,7 @@ Where's the warranty for your fridge?
A) Filing cabinet somewhere A) Filing cabinet somewhere
B) Email from 3 years ago B) Email from 3 years ago
C) No idea 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. Be option D.
``` ```
@@ -109,7 +109,7 @@ Be option D.
Sound familiar? 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) (pun intended)
``` ```
@@ -152,7 +152,7 @@ Reply with:
5/ Smoke detector batteries — Every 6 months. Life-saving. 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:** **Slide 1:**
``` ```
MEET CASERA MEET HONEYDUE
The home maintenance app you didn't know you needed The home maintenance app you didn't know you needed
(but definitely do) (but definitely do)
@@ -187,7 +187,7 @@ Sound familiar?
``` ```
THE SOLUTION THE SOLUTION
Casera organizes everything: honeyDue organizes everything:
📋 Tasks — recurring reminders that actually recur 📋 Tasks — recurring reminders that actually recur
📄 Documents — warranties, manuals, receipts 📄 Documents — warranties, manuals, receipts
@@ -219,7 +219,7 @@ GET STARTED FREE
Your home works hard for you. Your home works hard for you.
Let's return the favor. Let's return the favor.
Download Casera Download honeyDue
Link in bio 🏠 Link in bio 🏠
``` ```
@@ -232,7 +232,7 @@ Link in bio 🏠
Caption: Caption:
Sunday morning coffee hits different when you're not mentally running through everything you forgot to maintain. 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. You handle the relaxing.
#homeowner #homeownership #adulting #homemaintenance #organizedhome #homeownertips #firsttimehomebuyer #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. 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 #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. $4,200 lesson learned.
Now I use Casera." Now I use honeyDue."
— Every homeowner, eventually — Every homeowner, eventually
@@ -281,7 +281,7 @@ Hook: "Nobody told me homes need THIS much maintenance"
Content: Content:
- Quick cuts of common maintenance tasks - Quick cuts of common maintenance tasks
- Text overlays with frequency - Text overlays with frequency
- End with Casera app demo - End with honeyDue app demo
Audio: Trending sound Audio: Trending sound
``` ```
@@ -303,7 +303,7 @@ Audio: Satisfying/success sound
``` ```
Weekly recurring content: Weekly recurring content:
- One maintenance tip per week - One maintenance tip per week
- Swipe up to add task to Casera - Swipe up to add task to honeyDue
- Build habit + community - Build habit + community
``` ```
@@ -314,7 +314,7 @@ Weekly recurring content:
### Launch Announcement ### 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: It started with a simple frustration. As a homeowner, I was juggling:
• Sticky notes for maintenance reminders • 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. 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: It's a home maintenance app that brings everything together:
→ Recurring task reminders (that actually recur) → 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. 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. Sometimes the most valuable technology is the simplest.
@@ -371,7 +371,7 @@ Sometimes the most valuable technology is the simplest.
### Feature Announcement Template ### Feature Announcement Template
``` ```
New in Casera: [FEATURE NAME] New in honeyDue: [FEATURE NAME]
The problem: [One sentence describing pain point] The problem: [One sentence describing pain point]
@@ -388,7 +388,7 @@ Update your app to try it today.
What feature should we build next? 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) ### Primary Hashtags (use on every post)
``` ```
#Casera #HomeMaintenance #HomeOwner #HomeManagement #honeyDue #HomeMaintenance #HomeOwner #HomeManagement
``` ```
### Secondary Hashtags (rotate based on content) ### Secondary Hashtags (rotate based on content)
@@ -435,12 +435,12 @@ Winter: #WinterHome #HeatingSystem
### Positive Feedback ### 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 ### 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 ### 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 ### 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!
``` ```

View File

@@ -1,8 +1,8 @@
openapi: 3.0.3 openapi: 3.0.3
info: info:
title: Casera (MyCrib) API title: honeyDue API
description: | 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. Consumed by iOS (SwiftUI) and Android (Compose) mobile clients via Kotlin Multiplatform.
## Authentication ## Authentication
@@ -24,10 +24,10 @@ info:
All errors follow a consistent JSON shape. Validation errors include a `details` map. All errors follow a consistent JSON shape. Validation errors include a `details` map.
version: 2.0.0 version: 2.0.0
contact: contact:
name: Casera Team name: honeyDue Team
servers: servers:
- url: https://mycrib.treytartt.com/api - url: https://honeyDue.treytartt.com/api
description: Production description: Production
- url: http://127.0.0.1:8000/api - url: http://127.0.0.1:8000/api
description: Local development (iOS simulator) description: Local development (iOS simulator)
@@ -813,7 +813,7 @@ paths:
post: post:
tags: [Residences] tags: [Residences]
operationId: generateSharePackage operationId: generateSharePackage
summary: Generate a share package (.casera file metadata) summary: Generate a share package (.honeydue file metadata)
security: security:
- tokenAuth: [] - tokenAuth: []
parameters: parameters:

2
go.mod
View File

@@ -1,4 +1,4 @@
module github.com/treytartt/casera-api module github.com/treytartt/honeydue-api
go 1.24.0 go 1.24.0

View File

@@ -1,6 +1,6 @@
package dto package dto
import "github.com/treytartt/casera-api/internal/middleware" import "github.com/treytartt/honeydue-api/internal/middleware"
// PaginationParams holds pagination query parameters // PaginationParams holds pagination query parameters
type PaginationParams struct { type PaginationParams struct {

View File

@@ -6,7 +6,7 @@ import (
"github.com/stretchr/testify/assert" "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) { func TestAdminSortBy_ValidColumn_Works(t *testing.T) {

View File

@@ -7,9 +7,9 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminUserManagementHandler handles admin user management endpoints // AdminUserManagementHandler handles admin user management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminAppleSocialAuthHandler handles admin Apple social auth management endpoints // AdminAppleSocialAuthHandler handles admin Apple social auth management endpoints

View File

@@ -5,10 +5,10 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
) )
// AdminAuthHandler handles admin authentication endpoints // AdminAuthHandler handles admin authentication endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminAuthTokenHandler handles admin auth token management endpoints // AdminAuthTokenHandler handles admin auth token management endpoints

View File

@@ -8,8 +8,8 @@ import (
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminCompletionHandler handles admin task completion management endpoints // AdminCompletionHandler handles admin task completion management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminCompletionImageHandler handles admin task completion image management endpoints // AdminCompletionImageHandler handles admin task completion image management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminConfirmationCodeHandler handles admin confirmation code management endpoints // AdminConfirmationCodeHandler handles admin confirmation code management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminContractorHandler handles admin contractor management endpoints // AdminContractorHandler handles admin contractor management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/task/scopes" "github.com/treytartt/honeydue-api/internal/task/scopes"
) )
// AdminDashboardHandler handles admin dashboard endpoints // AdminDashboardHandler handles admin dashboard endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminDeviceHandler handles admin device management endpoints // AdminDeviceHandler handles admin device management endpoints

View File

@@ -9,8 +9,8 @@ import (
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminDocumentHandler handles admin document management endpoints // AdminDocumentHandler handles admin document management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminDocumentImageHandler handles admin document image management endpoints // AdminDocumentImageHandler handles admin document image management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminFeatureBenefitHandler handles admin feature benefit management endpoints // AdminFeatureBenefitHandler handles admin feature benefit management endpoints

View File

@@ -7,7 +7,7 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminLimitationsHandler handles subscription limitations management // AdminLimitationsHandler handles subscription limitations management

View File

@@ -9,10 +9,10 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/notifications" "github.com/treytartt/honeydue-api/internal/notifications"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// AdminLookupHandler handles admin lookup table management endpoints // AdminLookupHandler handles admin lookup table management endpoints

View File

@@ -10,10 +10,10 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/push" "github.com/treytartt/honeydue-api/internal/push"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// AdminNotificationHandler handles admin notification management endpoints // AdminNotificationHandler handles admin notification management endpoints
@@ -363,7 +363,7 @@ func (h *AdminNotificationHandler) SendTestEmail(c echo.Context) error {
<h2 style="color: #333;">` + escapedSubject + `</h2> <h2 style="color: #333;">` + escapedSubject + `</h2>
<div style="color: #666; line-height: 1.6;">` + escapedBody + `</div> <div style="color: #666; line-height: 1.6;">` + escapedBody + `</div>
<hr style="border: none; border-top: 1px solid #eee; margin: 30px 0;"> <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> </body>
</html>` </html>`

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminNotificationPrefsHandler handles notification preference management // AdminNotificationPrefsHandler handles notification preference management

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// AdminOnboardingHandler handles admin onboarding email operations // AdminOnboardingHandler handles admin onboarding email operations

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminPasswordResetCodeHandler handles admin password reset code management endpoints // AdminPasswordResetCodeHandler handles admin password reset code management endpoints

View File

@@ -8,8 +8,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminPromotionHandler handles admin promotion management endpoints // AdminPromotionHandler handles admin promotion management endpoints

View File

@@ -9,8 +9,8 @@ import (
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminResidenceHandler handles admin residence management endpoints // AdminResidenceHandler handles admin residence management endpoints

View File

@@ -12,8 +12,8 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// AdminSettingsHandler handles system settings management // AdminSettingsHandler handles system settings management

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminShareCodeHandler handles admin share code management endpoints // AdminShareCodeHandler handles admin share code management endpoints

View File

@@ -8,8 +8,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminSubscriptionHandler handles admin subscription management endpoints // AdminSubscriptionHandler handles admin subscription management endpoints

View File

@@ -9,8 +9,8 @@ import (
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminTaskHandler handles admin task management endpoints // AdminTaskHandler handles admin task management endpoints

View File

@@ -10,8 +10,8 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// AdminTaskTemplateHandler handles admin task template management endpoints // AdminTaskTemplateHandler handles admin task template management endpoints

View File

@@ -7,8 +7,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminUserHandler handles admin user management endpoints // AdminUserHandler handles admin user management endpoints

View File

@@ -8,8 +8,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/dto" "github.com/treytartt/honeydue-api/internal/admin/dto"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// AdminUserProfileHandler handles admin user profile management endpoints // AdminUserProfileHandler handles admin user profile management endpoints

View File

@@ -9,13 +9,13 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/admin/handlers" "github.com/treytartt/honeydue-api/internal/admin/handlers"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/monitoring" "github.com/treytartt/honeydue-api/internal/monitoring"
"github.com/treytartt/casera-api/internal/push" "github.com/treytartt/honeydue-api/internal/push"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// Dependencies holds optional services for admin routes // Dependencies holds optional services for admin routes

View File

@@ -9,9 +9,9 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/dto/responses" "github.com/treytartt/honeydue-api/internal/dto/responses"
"github.com/treytartt/casera-api/internal/i18n" "github.com/treytartt/honeydue-api/internal/i18n"
customvalidator "github.com/treytartt/casera-api/internal/validator" customvalidator "github.com/treytartt/honeydue-api/internal/validator"
) )
// HTTPErrorHandler handles all errors returned from handlers in a consistent way. // HTTPErrorHandler handles all errors returned from handlers in a consistent way.

View File

@@ -36,7 +36,7 @@ type ServerConfig struct {
CorsAllowedOrigins []string // Comma-separated origins for CORS (production only; debug uses wildcard) CorsAllowedOrigins []string // Comma-separated origins for CORS (production only; debug uses wildcard)
Timezone string Timezone string
StaticDir string // Directory for static landing page files 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 { type DatabaseConfig struct {
@@ -80,7 +80,7 @@ type PushConfig struct {
} }
type AppleAuthConfig 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 TeamID string // Apple Developer Team ID
} }
@@ -95,14 +95,14 @@ type AppleIAPConfig struct {
KeyPath string // Path to .p8 private key file KeyPath string // Path to .p8 private key file
KeyID string // Key ID from App Store Connect KeyID string // Key ID from App Store Connect
IssuerID string // Issuer 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 Sandbox bool // Use sandbox environment for testing
} }
// GoogleIAPConfig holds Google Play Developer API configuration // GoogleIAPConfig holds Google Play Developer API configuration
type GoogleIAPConfig struct { type GoogleIAPConfig struct {
ServiceAccountPath string // Path to service account JSON file 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 // StripeConfig holds Stripe payment configuration
@@ -293,13 +293,13 @@ func setDefaults() {
viper.SetDefault("ALLOWED_HOSTS", "localhost,127.0.0.1") viper.SetDefault("ALLOWED_HOSTS", "localhost,127.0.0.1")
viper.SetDefault("TIMEZONE", "UTC") viper.SetDefault("TIMEZONE", "UTC")
viper.SetDefault("STATIC_DIR", "/app/static") viper.SetDefault("STATIC_DIR", "/app/static")
viper.SetDefault("BASE_URL", "https://casera.app") viper.SetDefault("BASE_URL", "https://honeyDue.treytartt.com")
// Database defaults // Database defaults
viper.SetDefault("DB_HOST", "localhost") viper.SetDefault("DB_HOST", "localhost")
viper.SetDefault("DB_PORT", 5432) viper.SetDefault("DB_PORT", 5432)
viper.SetDefault("POSTGRES_USER", "postgres") viper.SetDefault("POSTGRES_USER", "postgres")
viper.SetDefault("POSTGRES_DB", "casera") viper.SetDefault("POSTGRES_DB", "honeydue")
viper.SetDefault("DB_SSLMODE", "disable") viper.SetDefault("DB_SSLMODE", "disable")
viper.SetDefault("DB_MAX_OPEN_CONNS", 25) viper.SetDefault("DB_MAX_OPEN_CONNS", 25)
viper.SetDefault("DB_MAX_IDLE_CONNS", 10) viper.SetDefault("DB_MAX_IDLE_CONNS", 10)
@@ -315,10 +315,10 @@ func setDefaults() {
viper.SetDefault("EMAIL_USE_TLS", true) viper.SetDefault("EMAIL_USE_TLS", true)
viper.SetDefault("EMAIL_HOST_USER", "") viper.SetDefault("EMAIL_HOST_USER", "")
viper.SetDefault("EMAIL_HOST_PASSWORD", "") 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 // 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_USE_SANDBOX", true)
viper.SetDefault("APNS_PRODUCTION", false) viper.SetDefault("APNS_PRODUCTION", false)

View File

@@ -9,8 +9,8 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/logger" "gorm.io/gorm/logger"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// zerologGormWriter adapts zerolog for GORM's logger interface // 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, 3, 'Permissions', 'fa-ban', '/info/goadmin_permissions', ''),
(2, 1, 4, 'Menu', 'fa-bars', '/menu', ''), (2, 1, 4, 'Menu', 'fa-bars', '/menu', ''),
(2, 1, 5, 'Operation Log', 'fa-history', '/info/goadmin_operation_log', ''), (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, 1, 'Users', 'fa-user', '/info/users', ''),
(8, 1, 2, 'Residences', 'fa-building', '/info/residences', ''), (8, 1, 2, 'Residences', 'fa-building', '/info/residences', ''),
(8, 1, 3, 'Tasks', 'fa-tasks', '/info/tasks', ''), (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. // Seed default Next.js admin user only on first run.
// Password is NOT reset on subsequent migrations to preserve operator changes. // Password is NOT reset on subsequent migrations to preserve operator changes.
var adminCount int64 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 { if adminCount == 0 {
log.Info().Msg("Seeding default admin user for Next.js admin panel...") log.Info().Msg("Seeding default admin user for Next.js admin panel...")
db.Exec(` db.Exec(`
INSERT INTO admin_users (email, password, first_name, last_name, role, is_active, created_at, updated_at) 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 return nil

View File

@@ -5,7 +5,7 @@ import (
"github.com/shopspring/decimal" "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 // CreateDocumentRequest represents the request to create a document

View File

@@ -3,7 +3,7 @@ package responses
import ( import (
"time" "time"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// UserResponse represents a user in API responses // UserResponse represents a user in API responses

View File

@@ -3,7 +3,7 @@ package responses
import ( import (
"time" "time"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// ContractorSpecialtyResponse represents a contractor specialty // ContractorSpecialtyResponse represents a contractor specialty

View File

@@ -6,7 +6,7 @@ import (
"github.com/shopspring/decimal" "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 // DocumentUserResponse represents a user in document context

View File

@@ -5,7 +5,7 @@ import (
"github.com/shopspring/decimal" "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 // 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 // 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 { type SharePackageResponse struct {
ShareCode string `json:"share_code"` ShareCode string `json:"share_code"`
ResidenceName string `json:"residence_name"` ResidenceName string `json:"residence_name"`

View File

@@ -6,9 +6,9 @@ import (
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/task/categorization" "github.com/treytartt/honeydue-api/internal/task/categorization"
"github.com/treytartt/casera-api/internal/task/predicates" "github.com/treytartt/honeydue-api/internal/task/predicates"
) )
// TaskCategoryResponse represents a task category // TaskCategoryResponse represents a task category

View File

@@ -4,7 +4,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
) )
// TaskTemplateResponse represents a task template in the API response // TaskTemplateResponse represents a task template in the API response

View File

@@ -7,12 +7,12 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/dto/responses" "github.com/treytartt/honeydue-api/internal/dto/responses"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/validator" "github.com/treytartt/honeydue-api/internal/validator"
) )
// AuthHandler handles authentication endpoints // AuthHandler handles authentication endpoints

View File

@@ -10,11 +10,11 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil" "github.com/treytartt/honeydue-api/internal/testutil"
) )
func setupAuthHandler(t *testing.T) (*AuthHandler, *echo.Echo, *repositories.UserRepository) { func setupAuthHandler(t *testing.T) (*AuthHandler, *echo.Echo, *repositories.UserRepository) {

View File

@@ -6,10 +6,10 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// ContractorHandler handles contractor-related HTTP requests // ContractorHandler handles contractor-related HTTP requests

View File

@@ -10,10 +10,10 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil" "github.com/treytartt/honeydue-api/internal/testutil"
) )
func setupContractorHandler(t *testing.T) (*ContractorHandler, *echo.Echo, *gorm.DB) { func setupContractorHandler(t *testing.T) (*ContractorHandler, *echo.Echo, *gorm.DB) {

View File

@@ -10,12 +10,12 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// DocumentHandler handles document-related HTTP requests // DocumentHandler handles document-related HTTP requests

View File

@@ -10,10 +10,10 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil" "github.com/treytartt/honeydue-api/internal/testutil"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -6,10 +6,10 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// MediaHandler handles authenticated media serving // MediaHandler handles authenticated media serving

View File

@@ -6,8 +6,8 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// newTestStorageService creates a StorageService with a known upload directory for testing. // newTestStorageService creates a StorageService with a known upload directory for testing.

View File

@@ -4,10 +4,10 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil" "github.com/treytartt/honeydue-api/internal/testutil"
) )
// TestTaskHandler_NoAuth_Returns401 verifies that task handler endpoints return // TestTaskHandler_NoAuth_Returns401 verifies that task handler endpoints return

View File

@@ -6,9 +6,9 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// NotificationHandler handles notification-related HTTP requests // NotificationHandler handles notification-related HTTP requests

View File

@@ -11,10 +11,10 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil" "github.com/treytartt/honeydue-api/internal/testutil"
) )
func setupNotificationHandler(t *testing.T) (*NotificationHandler, *echo.Echo, *gorm.DB) { func setupNotificationHandler(t *testing.T) (*NotificationHandler, *echo.Echo, *gorm.DB) {

View File

@@ -6,12 +6,12 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/i18n" "github.com/treytartt/honeydue-api/internal/i18n"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/validator" "github.com/treytartt/honeydue-api/internal/validator"
) )
// ResidenceHandler handles residence-related HTTP requests // 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/ // 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 { func (h *ResidenceHandler) GenerateSharePackage(c echo.Context) error {
user, err := middleware.MustGetAuthUser(c) user, err := middleware.MustGetAuthUser(c)
if err != nil { if err != nil {

View File

@@ -11,11 +11,11 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil" "github.com/treytartt/honeydue-api/internal/testutil"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -8,9 +8,9 @@ import (
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/dto/responses" "github.com/treytartt/honeydue-api/internal/dto/responses"
"github.com/treytartt/casera-api/internal/i18n" "github.com/treytartt/honeydue-api/internal/i18n"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// SeededDataResponse represents the unified seeded data response // SeededDataResponse represents the unified seeded data response

View File

@@ -5,9 +5,9 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// SubscriptionHandler handles subscription-related HTTP requests // SubscriptionHandler handles subscription-related HTTP requests

View File

@@ -17,10 +17,10 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/config" "github.com/treytartt/honeydue-api/internal/config"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// SubscriptionWebhookHandler handles subscription webhook callbacks // SubscriptionWebhookHandler handles subscription webhook callbacks

View File

@@ -9,10 +9,10 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// TaskHandler handles task-related HTTP requests // TaskHandler handles task-related HTTP requests

View File

@@ -12,11 +12,11 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/treytartt/casera-api/internal/dto/requests" "github.com/treytartt/honeydue-api/internal/dto/requests"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/repositories" "github.com/treytartt/honeydue-api/internal/repositories"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
"github.com/treytartt/casera-api/internal/testutil" "github.com/treytartt/honeydue-api/internal/testutil"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -6,8 +6,8 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// TaskTemplateHandler handles task template endpoints // TaskTemplateHandler handles task template endpoints

View File

@@ -7,7 +7,7 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// TrackingHandler handles email tracking endpoints // TrackingHandler handles email tracking endpoints

View File

@@ -6,10 +6,10 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/treytartt/casera-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/apperrors"
"github.com/treytartt/casera-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/middleware"
"github.com/treytartt/casera-api/internal/models" "github.com/treytartt/honeydue-api/internal/models"
"github.com/treytartt/casera-api/internal/services" "github.com/treytartt/honeydue-api/internal/services"
) )
// UploadHandler handles file upload endpoints // UploadHandler handles file upload endpoints

Some files were not shown because too many files have changed in this diff Show More