Init
This commit is contained in:
commit
d0187f94d7
23 changed files with 2489 additions and 0 deletions
107
headers.go
Normal file
107
headers.go
Normal file
|
@ -0,0 +1,107 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"html/template"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"spitfire-store/spm"
|
||||
)
|
||||
|
||||
func last(s []string) string {
|
||||
if len(s) == 0 {
|
||||
return ""
|
||||
}
|
||||
return s[len(s)-1]
|
||||
}
|
||||
|
||||
var storeTemplate = template.Must(template.New("store.html").Funcs(template.FuncMap{
|
||||
"last": last,
|
||||
}).ParseFiles("templates/store.html"))
|
||||
var indexTemplate = template.Must(template.ParseFiles("templates/index.html"))
|
||||
|
||||
// indexHandler renders the main search page.
|
||||
func indexHandler(w http.ResponseWriter, r *http.Request) {
|
||||
indexTemplate.Execute(w, nil)
|
||||
}
|
||||
|
||||
// searchHandler uses spm.SearchPackages with the given query & filter,
|
||||
// converts results into a slice of maps for the template, and renders them.
|
||||
func searchHandler(w http.ResponseWriter, r *http.Request) {
|
||||
query := r.FormValue("q")
|
||||
filter := r.FormValue("filter")
|
||||
|
||||
if query == "" {
|
||||
http.Redirect(w, r, "/", http.StatusFound)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("Search query=%s, filter=%s", query, filter)
|
||||
|
||||
// Update local SPM index first
|
||||
if err := spm.UpdateIndex(); err != nil {
|
||||
http.Error(w, "Failed to update local index", http.StatusInternalServerError)
|
||||
log.Printf("spm.UpdateIndex error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Call our unified search. Ensure spm.SearchPackages handles
|
||||
// "addon", "theme", "layout", "bundle", "config", "all", etc.
|
||||
results, err := spm.SearchPackages(query, filter)
|
||||
if err != nil {
|
||||
http.Error(w, "Search error", http.StatusInternalServerError)
|
||||
log.Printf("spm.SearchPackages error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("Total results for query=%q, filter=%q: %d", query, filter, len(results))
|
||||
|
||||
// Convert each result into a map for the template.
|
||||
// For Mozilla addons, e.Type might be "addon" or "theme".
|
||||
// For SPM, e.Type might be "layout", "bundle", "config", etc.
|
||||
var items []map[string]interface{}
|
||||
for _, e := range results {
|
||||
item := map[string]interface{}{
|
||||
"type": e.Type,
|
||||
"name": e.Name,
|
||||
"release": e.Release,
|
||||
"os": e.OS,
|
||||
"arch": e.Arch,
|
||||
"downloadURL": e.DownloadURL,
|
||||
"icon": e.Icon,
|
||||
"url": e.URL,
|
||||
"screenshots": e.Screenshots,
|
||||
}
|
||||
items = append(items, item)
|
||||
}
|
||||
|
||||
// Render the store template with items
|
||||
if err := storeTemplate.Execute(w, items); err != nil {
|
||||
log.Printf("Error executing template: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// installHandler for AMO add-ons (unchanged)
|
||||
func installHandler(w http.ResponseWriter, r *http.Request) {
|
||||
slug := r.URL.Query().Get("slug")
|
||||
if slug == "" {
|
||||
http.Error(w, "Missing add-on slug", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
addon, err := fetchAddonDetails(slug)
|
||||
if err != nil {
|
||||
http.Error(w, "Failed to fetch add-on details", http.StatusInternalServerError)
|
||||
log.Printf("Error fetching details for slug '%s': %v", slug, err)
|
||||
return
|
||||
}
|
||||
var xpiURL string
|
||||
if len(addon.CurrentVersion.Files) > 0 {
|
||||
xpiURL = addon.CurrentVersion.Files[0].URL
|
||||
} else if addon.CurrentVersion.File != nil {
|
||||
xpiURL = addon.CurrentVersion.File.URL
|
||||
} else {
|
||||
http.Redirect(w, r, addon.URL, http.StatusFound)
|
||||
return
|
||||
}
|
||||
http.Redirect(w, r, xpiURL, http.StatusFound)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue