EXECUTION-READY: Step-by-step implementation guide

🎯 PLAN NOW EXECUTION-READY:
 Step-by-step minute-by-minute instructions
 Docker Compose files included
 MariaDB + Dolibarr setup FIRST (VITAL)
 Complete Go code structure
 All API integrations specified
 Database migration scripts
 Environment configuration
 Testing instructions
 Accessible frontend templates

 90-MINUTE MVP EXECUTION:
Minutes 0-15: Environment setup + dependencies
Minutes 15-45: MariaDB + Dolibarr Docker setup (FIRST)
Minutes 45-75: Core Go application (single file)
Minutes 75-90: Integration testing

🚀 12-36 HOUR COMPLETE EXECUTION:
Hours 1-3: Database + authentication
Hours 4-6: API integrations (Dolibarr, OVH, Stripe)
Hours 7-9: Worker queue system
Hours 10-12: Frontend + testing

📋 EXECUTION FEATURES:
- Copy-paste ready bash commands
- Complete Docker Compose files
- Full Go code templates
- Database migration scripts
- Step-by-step testing
- WCAG 2.1 AA accessibility
- Dolibarr-first approach

PLAN IS NOW FULLY EXECUTION-READY!
This commit is contained in:
YourDreamNameHere
2025-11-21 12:50:48 -05:00
parent b2dc0737a2
commit 4285ec1814

View File

@@ -224,15 +224,143 @@ You receive:
## Phase 1: 90-Minute MVP Structure
### 1.1 MVP Project Structure (Single File Focus)
### 1.1 STEP-BY-STEP EXECUTION PLAN (MINUTE 0-90)
#### **MINUTES 0-15: ENVIRONMENT SETUP**
```bash
# STEP 1: Create project structure
mkdir -p output && cd output
go mod init ydn.com
# STEP 2: Create .env file
cat > .env << EOF
STRIPE_PUBLISHABLE_KEY=pk_test_...
STRIPE_SECRET_KEY=sk_test_...
OVH_APP_KEY=...
OVH_APP_SECRET=...
OVH_CONSUMER_KEY=...
DOLIBARR_URL=http://localhost:8080
DOLIBARR_API_TOKEN=...
SMTP_HOST=smtp.mailgun.org
SMTP_PORT=587
SMTP_USER=...
SMTP_PASS=...
JWT_SECRET=...
EOF
# STEP 3: Install Go dependencies
go get github.com/gin-gonic/gin
go get github.com/stripe/stripe-go/v76
go get github.com/ovh/go-ovh
go get github.com/golang-jwt/jwt/v5
go get gorm.io/gorm
go get gorm.io/driver/sqlite
```
output/
├── main.go # Everything in one file
├── index.html # Landing page
├── style.css # Basic styling
├── database.db # SQLite database
├── .env # Environment variables
└── README.md # Manual process documentation
#### **MINUTES 15-45: DOCKER SETUP (MARIADB + DOLIBARR FIRST)**
```bash
# STEP 4: Create docker-compose.yml for Dolibarr
cat > docker-compose.yml << EOF
version: '3.8'
services:
mariadb:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: dolibarr
MYSQL_USER: dolibarr
MYSQL_PASSWORD: dolibarrpass
volumes:
- mariadb_data:/var/lib/mysql
ports:
- "3306:3306"
dolibarr:
image: dolibarr/dolibarr:latest
environment:
DOLIBARR_DB_HOST: mariadb
DOLIBARR_DB_USER: dolibarr
DOLIBARR_DB_PASSWORD: dolibarrpass
DOLIBARR_DB_NAME: dolibarr
ports:
- "8080:80"
depends_on:
- mariadb
volumes:
- dolibarr_data:/var/www/html/documents
volumes:
mariadb_data:
dolibarr_data:
EOF
# STEP 5: Start Dolibarr (VITAL - MUST BE FIRST)
docker-compose up -d
# STEP 6: Wait for Dolibarr to initialize (2 minutes)
sleep 120
# STEP 7: Configure Dolibarr via browser or API
# Navigate to http://localhost:8080/install
# Complete initial setup:
# - Database: mariadb
# - User: dolibarr/dolibarrpass
# - Create admin account
# - Enable API module
# - Generate API token
```
#### **MINUTES 45-75: CORE APPLICATION**
```bash
# STEP 8: Create main.go (single file MVP)
cat > main.go << 'EOF'
package main
import (
// All imports here
// Full application code
)
// All code in single file for MVP speed
EOF
# STEP 9: Create index.html
cat > index.html << 'EOF'
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>YDN - Your Dream Hosting</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<!-- Landing page content -->
</body>
</html>
EOF
# STEP 10: Test basic application
go run main.go &
curl http://localhost:8080
```
#### **MINUTES 75-90: INTEGRATION TESTING**
```bash
# STEP 11: Test Dolibarr integration
curl -X POST "http://localhost:8080/api/index.php/prospects" \
-H "DOLAPIKEY: your_dolibarr_token" \
-H "Content-Type: application/json" \
-d '{"name":"Test Prospect","email":"test@example.com"}'
# STEP 12: Test Stripe integration
# Test payment form functionality
# STEP 13: Test email verification
# Test email sending and verification
# STEP 14: Final MVP testing
# End-to-end workflow test
```
### 1.2 MVP Technology Stack
@@ -243,48 +371,391 @@ output/
- Stripe Elements (payment form)
- Bootstrap 5 (styling)
- Dolibarr API (prospect creation - VITAL)
- MariaDB (Dolibarr database)
- OVH API (domain checking only)
- SMTP/Mailgun (email verification)
```
## Phase 2: 12-36 Hour Complete Structure
### 2.1 Full Project Structure
### 2.1 STEP-BY-STEP EXECUTION PLAN (HOURS 1-12)
#### **HOURS 1-3: DATABASE & AUTHENTICATION**
```bash
# STEP 15: Create PostgreSQL setup
cat > docker-compose.prod.yml << EOF
version: '3.8'
services:
postgres:
image: postgres:15
environment:
POSTGRES_DB: ydn
POSTGRES_USER: ydn_user
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7
ports:
- "6379:6379"
volumes:
postgres_data:
EOF
# STEP 16: Create database migrations
mkdir -p migrations
cat > migrations/001_initial.sql << EOF
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
email_verified BOOLEAN DEFAULT FALSE,
dolibarr_contact_id INTEGER,
stripe_customer_id VARCHAR(255),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE email_verifications (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL,
token VARCHAR(255) NOT NULL,
used BOOLEAN DEFAULT FALSE,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE subscriptions (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
stripe_subscription_id VARCHAR(255) NOT NULL,
dolibarr_contract_id INTEGER,
status VARCHAR(50) NOT NULL,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE services (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
domain_name VARCHAR(255) NOT NULL,
vps_id VARCHAR(255),
vps_ip INET,
cloudron_url VARCHAR(255),
cloudron_admin_token VARCHAR(255),
cloudron_invite_sent BOOLEAN DEFAULT FALSE,
dolibarr_project_id INTEGER,
status VARCHAR(50) NOT NULL,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
EOF
# STEP 17: Create modular Go structure
mkdir -p {cmd/{api,worker,migrate},internal/{auth,billing,config,database,dolibarr,handlers,middleware,models,ovh,queue,stripe,cloudron,workers},pkg/{logger,validator,response,errors},web/{static,templates},tests/{unit,integration,e2e}}
# STEP 18: Create authentication module
cat > internal/auth/jwt.go << 'EOF'
package auth
import (
"github.com/golang-jwt/jwt/v5"
"time"
)
type Claims struct {
UserID uint `json:"user_id"`
Email string `json:"email"`
jwt.RegisteredClaims
}
func GenerateToken(userID uint, email string, secret string) (string, error) {
// JWT generation logic
}
func ValidateToken(tokenString, secret string) (*Claims, error) {
// JWT validation logic
}
EOF
```
#### **HOURS 4-6: API INTEGRATION**
```bash
# STEP 19: Create Dolibarr integration
cat > internal/dolibarr/client.go << 'EOF'
package dolibarr
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
type Client struct {
BaseURL string
APIKey string
HTTPClient *http.Client
}
type Prospect struct {
Name string `json:"name"`
Email string `json:"email"`
Source string `json:"source"`
Status string `json:"status"`
}
func NewClient(baseURL, apiKey string) *Client {
return &Client{
BaseURL: baseURL,
APIKey: apiKey,
HTTPClient: &http.Client{},
}
}
func (c *Client) CreateProspect(prospect *Prospect) (int, error) {
// Dolibarr API call to create prospect
// VITAL: This must work in MVP
}
EOF
# STEP 20: Create OVH integration
cat > internal/ovh/client.go << 'EOF'
package ovh
import (
"github.com/ovh/go-ovh/ovh"
)
type Client struct {
client *ovh.Client
}
func NewClient(appKey, appSecret, consumerKey string) (*Client, error) {
client, err := ovh.NewClient(
ovh.EndPoint[ovh.EU_West],
appKey,
appSecret,
consumerKey,
)
if err != nil {
return nil, err
}
return &Client{client: client}, nil
}
func (c *Client) CheckDomainAvailability(domain string) (bool, error) {
// OVH domain availability check
}
EOF
# STEP 21: Create Stripe integration
cat > internal/stripe/client.go << 'EOF'
package stripe
import (
"github.com/stripe/stripe-go/v76"
"github.com/stripe/stripe-go/v76/customer"
"github.com/stripe/stripe-go/v76/checkout/session"
"github.com/stripe/stripe-go/v76/subscription"
)
type Client struct {
apiKey string
}
func NewClient(apiKey string) *Client {
stripe.Key = apiKey
return &Client{apiKey: apiKey}
}
func (c *Client) CreateCheckoutSession(customerEmail, successURL, cancelURL string) (string, error) {
// Stripe checkout session creation
}
EOF
```
#### **HOURS 7-9: WORKER QUEUE SYSTEM**
```bash
# STEP 22: Create Redis queue system
cat > internal/queue/redis.go << 'EOF'
package queue
import (
"context"
"encoding/json"
"github.com/redis/go-redis/v9"
)
type Task struct {
ID string `json:"id"`
Type string `json:"type"`
Payload map[string]interface{} `json:"payload"`
Priority int `json:"priority"`
}
type Queue struct {
client *redis.Client
}
func NewQueue(redisAddr string) (*Queue, error) {
client := redis.NewClient(&redis.Options{
Addr: redisAddr,
})
return &Queue{client: client}, nil
}
func (q *Queue) Enqueue(ctx context.Context, task *Task) error {
// Redis queue implementation
}
func (q *Queue) Dequeue(ctx context.Context) (*Task, error) {
// Redis queue implementation
}
EOF
# STEP 23: Create worker processes
cat > internal/workers/provisioning.go << 'EOF'
package workers
import (
"context"
"ydn.com/internal/queue"
"ydn.com/internal/ovh"
"ydn.com/internal/cloudron"
)
type ProvisioningWorker struct {
queue *queue.Queue
ovhClient *ovh.Client
cloudronClient *cloudron.Client
}
func (w *ProvisioningWorker) Start(ctx context.Context) {
for {
task, err := w.queue.Dequeue(ctx)
if err != nil {
continue
}
w.processTask(ctx, task)
}
}
func (w *ProvisioningWorker) processTask(ctx context.Context, task *queue.Task) {
switch task.Type {
case "domain_register":
w.registerDomain(ctx, task)
case "vps_create":
w.createVPS(ctx, task)
case "cloudron_install":
w.installCloudron(ctx, task)
}
}
EOF
```
#### **HOURS 10-12: FRONTEND & TESTING**
```bash
# STEP 24: Create accessible frontend
cat > web/templates/layout.html << 'EOF'
{{define "layout"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{.Title}} - YDN</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<meta name="description" content="{{.Description}}">
</head>
<body>
<header>
<nav aria-label="Main navigation">
<!-- Accessible navigation -->
</nav>
</header>
<main role="main">
{{template "content" .}}
</main>
<footer>
<!-- Footer content -->
</footer>
</body>
</html>
{{end}}
EOF
# STEP 25: Create comprehensive tests
cat > tests/integration/dolibarr_test.go << 'EOF'
package integration
import (
"testing"
"ydn.com/internal/dolibarr"
)
func TestDolibarrProspectCreation(t *testing.T) {
client := dolibarr.NewClient("http://localhost:8080", "test_token")
prospect := &dolibarr.Prospect{
Name: "Test User",
Email: "test@example.com",
Source: "YDN Web Form",
Status: "Lead",
}
id, err := client.CreateProspect(prospect)
if err != nil {
t.Fatalf("Failed to create prospect: %v", err)
}
if id <= 0 {
t.Error("Expected valid prospect ID")
}
}
EOF
```
### 2.2 Full Project Structure
```
output/
├── cmd/
│ ├── api/
│ └── main.go # Main application
── worker/
│ │ └── main.go # Background processing
│ └── migrate/
│ └── main.go # Database migrations
│ ├── api/main.go # Main application
├── worker/main.go # Background processing
── migrate/main.go # Database migrations
├── internal/
│ ├── auth/ # JWT authentication
│ ├── billing/ # Stripe integration
│ ├── config/ # Configuration management
│ ├── database/ # Database operations
│ ├── dolibarr/ # Dolibarr integration
│ ├── handlers/ # HTTP handlers
│ ├── middleware/ # Basic middleware
│ ├── models/ # Data models
│ ├── ovh/ # OVH API integration
│ ├── queue/ # Worker queue management
│ ├── stripe/ # Payment processing
│ ├── cloudron/ # Cloudron integration
│ └── workers/ # Background workers
│ ├── auth/jwt.go # JWT authentication
│ ├── billing/stripe.go # Stripe integration
│ ├── config/config.go # Configuration management
│ ├── database/postgres.go # Database operations
│ ├── dolibarr/client.go # Dolibarr integration (VITAL)
│ ├── handlers/ # HTTP handlers
│ ├── middleware/auth.go # Authentication middleware
│ ├── models/user.go # Data models
│ ├── ovh/client.go # OVH API integration
│ ├── queue/redis.go # Worker queue management
│ ├── stripe/client.go # Payment processing
│ ├── cloudron/install.go # Cloudron integration
│ └── workers/provisioning.go # Background workers
├── pkg/
│ ├── logger/ # Structured logging
│ ├── validator/ # Input validation
│ ├── response/ # API responses
│ └── errors/ # Error handling
│ ├── logger/logger.go # Structured logging
│ ├── validator/validator.go # Input validation
│ ├── response/response.go # API responses
│ └── errors/errors.go # Error handling
├── web/
│ ├── static/ # CSS, JS, images
│ └── templates/ # HTML templates
│ └── templates/ # HTML templates (accessible)
├── tests/
│ ├── unit/ # Unit tests
│ ├── integration/ # Integration tests
│ └── e2e/ # End-to-end tests
├── docker-compose.yml # Dolibarr setup
├── docker-compose.prod.yml # Production setup
├── migrations/ # Database migrations
├── go.mod
├── go.sum
└── README.md