package queryapi import ( "context" "fmt" "net/http" "strings" "github.com/labstack/echo/v4" "github.com/lestrrat-go/jwx/v2/jwt" ) // Constants for route paths const ( LOGIN_CALLBACK_PATH = "/login-callback" ) // endpointsList keeps track of registered endpoints // This list should be kept in sync with actual route registrations var endpointsList = []string{ // Auth Service Endpoints "/login", LOGIN_CALLBACK_PATH, "/logout", "/home", // Client Service Endpoints "/client", // Query API Endpoints "/query", // Document Service Endpoints "/document", // Export Service Endpoints "/export", } // homeHandler renders a simple HTML page with links to all endpoints // and displays authentication status based on JWT token func HomeHandler(c echo.Context) error { var linksHTML string baseURL := "http://localhost:8080" // Create list items for each endpoint for _, endpoint := range endpointsList { // Skip endpoints with path parameters for direct linking if strings.Contains(endpoint, ":") { displayPath := strings.Replace(endpoint, ":id", "{id}", -1) linksHTML += fmt.Sprintf("
  • %s (requires parameter)
  • \n", displayPath) } else { linksHTML += fmt.Sprintf("
  • %s
  • \n", baseURL, endpoint, endpoint) } } // Check if user is authenticated by looking for token in cookie tokenCookie, err := c.Cookie("auth_token") isAuthenticated := (err == nil && tokenCookie.Value != "") // Variables for user info username := "" email := "" var userGroups []string // If authenticated, try to decode the JWT token to get user info if isAuthenticated { // Parse the JWT token without verification (just to extract info for display) // In a production application, you would want to verify the token here as well token, _ := jwt.Parse([]byte(tokenCookie.Value), jwt.WithVerify(false)) if token != nil { claims, _ := token.AsMap(context.Background()) username, _ = claims["cognito:username"].(string) email, _ = claims["email"].(string) // Try to extract groups if rawGroups, ok := claims["cognito:groups"]; ok { if groups, ok := rawGroups.([]interface{}); ok { userGroups = make([]string, len(groups)) for i, g := range groups { userGroups[i] = fmt.Sprint(g) } } } } } // Create authentication status section var authStatusHTML string if isAuthenticated { authStatusHTML = fmt.Sprintf(`

    Authentication Status: Authenticated

    Username: %s

    Email: %s

    Groups: %s

    Logout

    `, username, email, strings.Join(userGroups, ", ")) } else { authStatusHTML = `

    Authentication Status: Not Authenticated

    You are not currently logged in.

    ` } // Create the complete HTML page html := fmt.Sprintf(` Doczy Home

    Doczy Home

    %s

    Available Endpoints

    Note: This is a debugging page. Some endpoints require authentication or specific permissions.

    `, authStatusHTML, linksHTML) return c.HTML(http.StatusOK, html) }