From cf085e93b7abc53b8ecc78c07210384e0ff8d516 Mon Sep 17 00:00:00 2001 From: Ewy~ Date: Tue, 31 Mar 2026 17:18:35 +0200 Subject: initial commit --- pages/create.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 pages/create.go (limited to 'pages/create.go') diff --git a/pages/create.go b/pages/create.go new file mode 100644 index 0000000..03f4159 --- /dev/null +++ b/pages/create.go @@ -0,0 +1,85 @@ +package pages + +import ( + "delayed.link/storage" + _ "embed" + "html/template" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +func CreateLink(w http.ResponseWriter, r *http.Request) *storage.Link { + err := r.ParseForm() + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return nil + } + form := r.PostForm + + minutesInFutureStr := form.Get("minutes_in_future") + if strings.TrimSpace(minutesInFutureStr) == "" { + http.Error(w, "minutes_in_future is required", http.StatusBadRequest) + return nil + } + minutesInFuture, err := strconv.Atoi(minutesInFutureStr) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return nil + } + if minutesInFuture < 0 { + http.Error(w, "minutes_in_future has to be > 0", http.StatusBadRequest) + } + numberOfOpensStr := form.Get("number_of_opens") + if strings.TrimSpace(minutesInFutureStr) == "" { + http.Error(w, "number_of_opens is required", http.StatusBadRequest) + return nil + } + numberOfOpens, err := strconv.Atoi(numberOfOpensStr) + if numberOfOpens < 0 || numberOfOpens > 100 { + http.Error(w, "number_of_opens needs to be between 1 and 100", http.StatusBadRequest) + return nil + } + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return nil + } + payload := form.Get("payload") + //TODO: Verify payload + if _, err := url.Parse(payload); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return nil + } + + l := storage.Link{ + Target: payload, + OpensFrom: time.Now().Add(time.Duration(minutesInFuture) * time.Minute), + OpensLeft: numberOfOpens, + } + + id, err := l.Save(storage.Current) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return nil + } + (&l).Id = id + + return &l +} + +//go:embed create.gohtml +var recContent string +var recTmpl = template.Must(template.New("delayed.link").Parse(recContent)) + +func Create(w http.ResponseWriter, r *http.Request) { + l := CreateLink(w, r) + if l == nil { + return + } + err := recTmpl.Execute(w, l) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} -- cgit v1.3