120 lines
2.8 KiB
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)
|
|
}
|