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}