Commit d345b2f4 authored by Andreas Düren's avatar Andreas Düren
Browse files

Fix API server and URL handling for frontend connectivity

parent f4fd4fdf
Loading
Loading
Loading
Loading
+120 −53
Original line number Diff line number Diff line
@@ -1073,13 +1073,13 @@ else
    # Create a proper Go module structure - this is critical for the build
    echo "==> Creating proper Go module structure"
    
    # Initialize an explicit Go module 
    echo "module mock-server" > go.mod
    # Initialize an explicit Go module with specified go version
    echo "module main" > go.mod
    echo "go 1.19" >> go.mod
    
    # Write main.go as a single file with correct quoted heredoc
    # Write main.go as a single file without heredoc
    echo "==> Writing main.go file for mock API server"
    cat > main.go <<'ENDOFPROGRAM'
    cat > main.go << 'ENDOFFILE'
package main

import (
@@ -1140,6 +1140,72 @@ func main() {
        fmt.Fprintf(w, `{"status":"ok","version":"mock-1.0.0","time":"%s"}`, time.Now().Format(time.RFC3339))
    })

    // Handle OTT (One-Time Token) requests
    http.HandleFunc("/users/ott", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == "POST" {
            body, err := io.ReadAll(r.Body)
            if err != nil {
                http.Error(w, "Error reading request body", http.StatusBadRequest)
                return
            }
            
            logger.Printf("REGISTRATION REQUEST TO /users/ott: %s", string(body))
            
            // Extract email from request - simplified parsing
            emailStart := strings.Index(string(body), "\"email\":\"")
            var email string
            if emailStart >= 0 {
                emailStart += 9 // Length of "\"email\":\""
                emailEnd := strings.Index(string(body)[emailStart:], "\"")
                if emailEnd >= 0 {
                    email = string(body)[emailStart : emailStart+emailEnd]
                }
            }
            
            // Generate verification code - 6 digits for OTT
            verificationCode := fmt.Sprintf("%06d", 100000 + rand.Intn(900000)) // 6-digit code
            if email != "" {
                verificationCodes[email] = verificationCode
                logger.Printf("===================================================")
                logger.Printf("⚠️  OTT/VERIFICATION CODE for %s: %s", email, verificationCode)
                logger.Printf("===================================================")
                
                // Also log to console for immediate visibility
                fmt.Printf("===================================================\n")
                fmt.Printf("⚠️  OTT/VERIFICATION CODE for %s: %s\n", email, verificationCode)
                fmt.Printf("===================================================\n")
            }
            
            // Return a success response with properly formatted data
            w.Header().Set("Content-Type", "application/json")
            
            // Create a response with the required fields
            jsonResponse := map[string]interface{}{
                "status": "ok",
                "id": 12345, // Add required ID field as a number
                "token": "mock-token-12345",
                "ott": verificationCode,
                "exp": time.Now().Add(time.Hour).Unix(),
                "email": email,
                "createdAt": time.Now().Format(time.RFC3339),
                "updatedAt": time.Now().Format(time.RFC3339),
                "key": map[string]interface{}{
                    "pubKey": "mockPubKey123456",
                    "encPubKey": "mockEncPubKey123456",
                    "kty": "mockKty",
                    "kid": "mockKid",
                    "alg": "mockAlg",
                    "verifyKey": "mockVerifyKey123456",
                },
            }
            json.NewEncoder(w).Encode(jsonResponse)
        } else {
            // Just handle other methods with a generic response
            w.Header().Set("Content-Type", "application/json")
            fmt.Fprintf(w, `{"status":"mock","endpoint":"%s","method":"%s"}`, r.URL.Path, r.Method)
        }
    })
    
    // Generic handler for all other requests
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        logger.Printf("Received request for %s via %s", r.URL.Path, r.Method)
@@ -1172,13 +1238,15 @@ func main() {
        logger.Fatalf("Server failed: %v", err)
    }
}
ENDOFPROGRAM
ENDOFFILE
    
    # Show the created files for debugging
    echo "==> Listing created files:"
    ls -la
    echo "==> Contents of go.mod:"
    cat go.mod
    echo "==> First 10 lines of main.go:"
    head -10 main.go
    
    # Completely unset Go module environment variables
    echo "==> Unsetting module flags before building mock server"
@@ -1187,7 +1255,7 @@ ENDOFPROGRAM
    unset GOPATH
    unset GOMODCACHE
    
    # Build the mock server using the direct build command
    # Build the mock server using Go directly
    echo "==> Building mock API server on port 8080"
    
    # Show Go version
@@ -1196,47 +1264,20 @@ ENDOFPROGRAM
    # Set SERVER_PID to 0 initially - CRITICAL for avoiding unbound variable later
    SERVER_PID=0
    
    # Try building with explicit output file
    if go build -o mock_server .; then
        echo "==> Successfully compiled mock API server"
        
        # Create log directory if it doesn't exist
    # Use go run instead of build to simplify the process
    echo "==> Running Go mock API server directly"
    mkdir -p /app/data/logs
    touch /app/data/logs/api_requests.log
    chmod 666 /app/data/logs/api_requests.log
    
        # Start the server and log both to file and to console
        chmod +x ./mock_server
        nohup ./mock_server > /app/data/logs/mock_server.log 2>&1 &
    # Run directly with go run in the background
    nohup go run main.go > /app/data/logs/mock_server.log 2>&1 &
    SERVER_PID=$!
    echo "==> Mock API server started with PID $SERVER_PID"
    
    # Wait to ensure the server is up
    echo "==> Waiting for server to start..."
    sleep 5  # Increased sleep time for better reliability
        
        # Check if the server is actually running
        if ps -p $SERVER_PID > /dev/null; then
            echo "==> Mock API server is running with PID $SERVER_PID"
            
            # Check if the port is actually listening
            if netstat -tulpn 2>/dev/null | grep ":8080" > /dev/null; then
                echo "==> Mock API server is listening on port 8080"
            else
                echo "==> WARNING: Mock API server doesn't appear to be listening on port 8080"
                echo "==> Checking server logs:"
                tail -n 30 /app/data/logs/mock_server.log
            fi
        else
            echo "==> ERROR: Mock API server failed to start"
            echo "==> Server log:"
            cat /app/data/logs/mock_server.log
            # Reset SERVER_PID if process died
            SERVER_PID=0
        fi
    else
        echo "==> ERROR: Failed to build mock API server"
        go version
        # Server PID is already set to 0 above
    fi
fi

echo "==> Server started with PID ${SERVER_PID:-0}"
@@ -1616,15 +1657,41 @@ window.process.env.REACT_APP_ENTE_ENDPOINT = '${API_ENDPOINT}';
// Make sure all URLs are properly formatted for URL constructor
if (!window.ENTE_CONFIG.API_URL.startsWith('http')) {
    console.log('Adding https:// prefix to API_URL');
    // Ensure the API URL has a proper protocol prefix for URL constructor
    if (window.ENTE_CONFIG.API_URL.startsWith('/')) {
        window.ENTE_CONFIG.API_URL = window.location.origin + window.ENTE_CONFIG.API_URL;
    } else {
        window.ENTE_CONFIG.API_URL = window.location.origin + '/' + window.ENTE_CONFIG.API_URL;
    }
    
    // Fix environment variables too
    if (window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT.startsWith('/')) {
        window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT = window.location.origin + window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT;
    } else {
        window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT = window.location.origin + '/' + window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT;
    }
    
    // Same for other variables
    if (window.process.env.REACT_APP_ENTE_ENDPOINT.startsWith('/')) {
        window.process.env.REACT_APP_ENTE_ENDPOINT = window.location.origin + window.process.env.REACT_APP_ENTE_ENDPOINT;
    } else {
        window.process.env.REACT_APP_ENTE_ENDPOINT = window.location.origin + '/' + window.process.env.REACT_APP_ENTE_ENDPOINT;
    }
    
    if (window.process.env.NEXT_PUBLIC_REACT_APP_ENTE_ENDPOINT && !window.process.env.NEXT_PUBLIC_REACT_APP_ENTE_ENDPOINT.startsWith('http')) {
        if (window.process.env.NEXT_PUBLIC_REACT_APP_ENTE_ENDPOINT.startsWith('/')) {
            window.process.env.NEXT_PUBLIC_REACT_APP_ENTE_ENDPOINT = window.location.origin + window.process.env.NEXT_PUBLIC_REACT_APP_ENTE_ENDPOINT;
        } else {
            window.process.env.NEXT_PUBLIC_REACT_APP_ENTE_ENDPOINT = window.location.origin + '/' + window.process.env.NEXT_PUBLIC_REACT_APP_ENTE_ENDPOINT;
        }
    }
}

// Extra logging to debug URL construction
console.log('Ente runtime config loaded from runtime-config.js');
console.log('API_URL:', window.ENTE_CONFIG.API_URL);
console.log('PUBLIC_ALBUMS_URL:', window.ENTE_CONFIG.PUBLIC_ALBUMS_URL);
console.log('API_URL (final):', window.ENTE_CONFIG.API_URL);
console.log('PUBLIC_ALBUMS_URL (final):', window.ENTE_CONFIG.PUBLIC_ALBUMS_URL);
console.log('NEXT_PUBLIC_ENTE_ENDPOINT (final):', window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT);
EOF

    # Update the variables in the runtime config