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, } l.OpensStr = l.OpensFrom.Format(time.UnixDate) id, err := l.Save(storage.Current) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return nil } (&l).Id = id return &l } var tmpl = template.New("delayed.link") func Create(w http.ResponseWriter, r *http.Request) { l := CreateLink(w, r) if l == nil { return } err := tmpl.ExecuteTemplate(w, "create", l) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } //go:embed create.gohtml var recContent string //go:embed style.gohtml var style string //go:embed header.gohtml var header string func init() { template.Must(tmpl.Parse(style)) template.Must(tmpl.Parse(header)) template.Must(tmpl.New("create").Parse(recContent)) }