ws.go

  1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
  2//
  3// SPDX-License-Identifier: Apache-2.0
  4
  5package main
  6
  7import (
  8	"embed"
  9	"fmt"
 10	"io"
 11	"net/http"
 12	"net/url"
 13	"strings"
 14	"text/template"
 15)
 16
 17//go:embed static
 18var fs embed.FS
 19
 20func rootHandler(w http.ResponseWriter, r *http.Request) {
 21	req <- struct{}{}
 22	data := <-res
 23	tmpl := template.Must(template.ParseFS(fs, "static/home.html"))
 24	if err := tmpl.Execute(w, data); err != nil {
 25		fmt.Println(err)
 26	}
 27}
 28
 29func newHandler(w http.ResponseWriter, r *http.Request) {
 30	params := r.URL.Query()
 31	action := bmStrict.Sanitize(params.Get("action"))
 32	if r.Method == http.MethodGet {
 33		if action == "" {
 34			tmpl := template.Must(template.ParseFS(fs, "static/new.html"))
 35			if err := tmpl.Execute(w, nil); err != nil {
 36				fmt.Println(err)
 37			}
 38		} else if action != "delete" {
 39			submittedURL := bmStrict.Sanitize(params.Get("submittedURL"))
 40			if submittedURL == "" {
 41				w.WriteHeader(http.StatusBadRequest)
 42				_, err := w.Write([]byte("No URL provided"))
 43				if err != nil {
 44					fmt.Println(err)
 45				}
 46				return
 47			}
 48
 49			forge := bmStrict.Sanitize(params.Get("forge"))
 50			if forge == "" {
 51				w.WriteHeader(http.StatusBadRequest)
 52				_, err := w.Write([]byte("No forge provided"))
 53				if err != nil {
 54					fmt.Println(err)
 55				}
 56				return
 57			}
 58
 59			name := bmStrict.Sanitize(params.Get("name"))
 60			if name == "" {
 61				w.WriteHeader(http.StatusBadRequest)
 62				_, err := w.Write([]byte("No name provided"))
 63				if err != nil {
 64					fmt.Println(err)
 65
 66				}
 67			}
 68
 69			proj := project{
 70				URL:   submittedURL,
 71				Name:  name,
 72				Forge: forge,
 73			}
 74			proj, err := getReleases(proj)
 75			if err != nil {
 76				w.WriteHeader(http.StatusBadRequest)
 77				_, err := w.Write([]byte(fmt.Sprintf("Error getting releases: %s", err)))
 78				if err != nil {
 79					fmt.Println(err)
 80
 81				}
 82			}
 83			tmpl := template.Must(template.ParseFS(fs, "static/select-release.html"))
 84			if err := tmpl.Execute(w, proj); err != nil {
 85				fmt.Println(err)
 86			}
 87		} else if action == "delete" {
 88			submittedURL := params.Get("submittedURL")
 89			if submittedURL == "" {
 90				w.WriteHeader(http.StatusBadRequest)
 91				_, err := w.Write([]byte("No URL provided"))
 92				if err != nil {
 93					fmt.Println(err)
 94
 95				}
 96			}
 97
 98			untrack(submittedURL)
 99			http.Redirect(w, r, "/", http.StatusSeeOther)
100		}
101	}
102
103	if r.Method == http.MethodPost {
104		err := r.ParseForm()
105		if err != nil {
106			fmt.Println(err)
107		}
108		nameValue := bmStrict.Sanitize(r.FormValue("name"))
109		urlValue := bmStrict.Sanitize(r.FormValue("url"))
110		forgeValue := bmStrict.Sanitize(r.FormValue("forge"))
111		releaseValue := bmStrict.Sanitize(r.FormValue("release"))
112
113		if nameValue != "" && urlValue != "" && forgeValue != "" && releaseValue != "" {
114			track(nameValue, urlValue, forgeValue, releaseValue)
115			http.Redirect(w, r, "/", http.StatusSeeOther)
116			return
117		}
118
119		if nameValue != "" && urlValue != "" && forgeValue != "" && releaseValue == "" {
120			http.Redirect(w, r, "/new?action=yoink&name="+url.QueryEscape(nameValue)+"&url="+url.QueryEscape(urlValue)+"&forge="+url.QueryEscape(forgeValue), http.StatusSeeOther)
121			return
122		}
123
124		if nameValue == "" && urlValue == "" && forgeValue == "" && releaseValue == "" {
125			w.WriteHeader(http.StatusBadRequest)
126			_, err := w.Write([]byte("No data provided"))
127			if err != nil {
128				fmt.Println(err)
129
130			}
131		}
132	}
133}
134
135func staticHandler(writer http.ResponseWriter, request *http.Request) {
136	resource := strings.TrimPrefix(request.URL.Path, "/")
137	// if path ends in .css, set content type to text/css
138	if strings.HasSuffix(resource, ".css") {
139		writer.Header().Set("Content-Type", "text/css")
140	} else if strings.HasSuffix(resource, ".js") {
141		writer.Header().Set("Content-Type", "text/javascript")
142	}
143	home, err := fs.ReadFile(resource)
144	if err != nil {
145		fmt.Println(err)
146	}
147	if _, err = io.WriteString(writer, string(home)); err != nil {
148		fmt.Println(err)
149	}
150}