wrappd.sh/internal/web/controller.go

120 lines
2.8 KiB
Go

package web
import (
"net/http"
"os"
"strconv"
"strings"
"github.com/google/uuid"
)
func handleIndex(w http.ResponseWriter, r *http.Request) {
tmpl, err := loadTemplates("index.html")
if err != nil {
http.Error(w, "Error loading template", http.StatusInternalServerError)
return
}
tmpl.Execute(w, nil)
}
func handleUpload(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
return
}
file, fileHeader, err := r.FormFile("file")
if err != nil {
http.Error(w, "Error reading file", http.StatusBadRequest)
return
}
defer file.Close()
isValid, err := isTextFileAndSizeOk(file, fileHeader.Size)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
if !isValid {
http.Error(w, "Invalid file type or size", http.StatusBadRequest)
return
}
totalCommands, uniqueCommands, commandCounts, categories, pipeRedirectionCounts, commonPatterns := ProcessHistory(file)
limit := os.Getenv("TOP_N_COMMANDS")
limitInt, err := strconv.Atoi(limit)
if err != nil {
limitInt = 5
}
// Stats
commandStats := ConvertAndSort(commandCounts, limitInt)
// Graph generation
bar := createBarChart(commandStats)
var chartHTML strings.Builder
if err := bar.Render(&chartHTML); err != nil {
http.Error(w, "Error generating chart", http.StatusInternalServerError)
return
}
// More stats
stats := GenerateStats(commandCounts, categories, commonPatterns)
stats["chartHTML"] = chartHTML.String()
// Categories
categoryStats := ConvertAndSort(categories, limitInt)
stats["categoryStats"] = categoryStats
// Top commands
topCommands := ConvertAndSort(commandCounts, limitInt)
stats["topCommands"] = topCommands
// Common patterns
commonPatternStats := ConvertAndSort(commonPatterns, limitInt)
stats["commonPatternStats"] = commonPatternStats
// Counts
stats["total"] = totalCommands
stats["unique"] = uniqueCommands
stats["pipeRedirectionCounts"] = pipeRedirectionCounts
// Save results
uniqueID := uuid.New().String()
saveResults(uniqueID, stats)
http.Redirect(w, r, "/results/"+uniqueID, http.StatusSeeOther)
}
func handleResults(w http.ResponseWriter, r *http.Request) {
uniqueID := strings.TrimPrefix(r.URL.Path, "/results/")
stats, err := loadResults(uniqueID)
if err != nil {
http.Error(w, "Results not found", http.StatusNotFound)
return
}
stats["uniqueID"] = uniqueID
baseURL := os.Getenv("BASE_URL")
if baseURL == "" {
baseURL = "https://wrappd.oscarmlage.com"
}
stats["baseURL"] = baseURL
mastodon := os.Getenv("MASTODON_INSTANCE_FOR_SHARING")
stats["mastodon"] = mastodon
tmpl, err := loadTemplates("result.html")
if err != nil {
http.Error(w, "Error loading template", http.StatusInternalServerError)
return
}
tmpl.Execute(w, stats)
}