package htmlhouse import ( "database/sql" "fmt" "io/ioutil" "net/http" "regexp" "strings" "time" "github.com/gorilla/mux" "github.com/writeas/impart" "github.com/writeas/nerds/store" "github.com/writeas/web-core/bots" ) func createHouse(app *app, w http.ResponseWriter, r *http.Request) error { html := r.FormValue("html") if strings.TrimSpace(html) == "" { return impart.HTTPError{http.StatusBadRequest, "Supply something to publish."} } houseID := store.GenerateFriendlyRandomString(8) _, err := app.db.Exec("INSERT INTO houses (id, html) VALUES (?, ?)", houseID, html) if err != nil { return err } if err = app.session.writeToken(w, houseID); err != nil { return err } resUser := newSessionInfo(houseID) return impart.WriteSuccess(w, resUser, http.StatusCreated) } func renovateHouse(app *app, w http.ResponseWriter, r *http.Request) error { vars := mux.Vars(r) houseID := vars["house"] html := r.FormValue("html") if strings.TrimSpace(html) == "" { return impart.HTTPError{http.StatusBadRequest, "Supply something to publish."} } authHouseID, err := app.session.readToken(r) if err != nil { return err } if authHouseID != houseID { return impart.HTTPError{http.StatusUnauthorized, "Bad token for this ⌂ house ⌂."} } _, err = app.db.Exec("UPDATE houses SET html = ? WHERE id = ?", html, houseID) if err != nil { return err } if err = app.session.writeToken(w, houseID); err != nil { return err } resUser := newSessionInfo(houseID) return impart.WriteSuccess(w, resUser, http.StatusOK) } func getHouseStats(app *app, houseID string) (*time.Time, int64, error) { var created time.Time var views int64 err := app.db.QueryRow("SELECT created, view_count FROM houses WHERE id = ?", houseID).Scan(&created, &views) switch { case err == sql.ErrNoRows: return nil, 0, impart.HTTPError{http.StatusNotFound, "Return to sender. Address unknown."} case err != nil: fmt.Printf("Couldn't fetch: %v\n", err) return nil, 0, err } return &created, views, nil } func getHouseHTML(app *app, houseID string) (string, error) { var html string err := app.db.QueryRow("SELECT html FROM houses WHERE id = ?", houseID).Scan(&html) switch { case err == sql.ErrNoRows: return "", impart.HTTPError{http.StatusNotFound, "Return to sender. Address unknown."} case err != nil: fmt.Printf("Couldn't fetch: %v\n", err) return "", err } return html, nil } var ( htmlReg = regexp.MustCompile("") ) func getHouse(app *app, w http.ResponseWriter, r *http.Request) error { vars := mux.Vars(r) houseID := vars["house"] // Fetch HTML html, err := getHouseHTML(app, houseID) if err != nil { if err, ok := err.(impart.HTTPError); ok { if err.Status == http.StatusNotFound { page, err := ioutil.ReadFile(app.cfg.StaticDir + "/404.html") if err != nil { page = []byte("
HTMLlot.") } fmt.Fprintf(w, "%s", page) return nil } } return err } // Add nofollow meta tag if strings.Index(html, "") == -1 { html = htmlReg.ReplaceAllString(html, "") } html = strings.Replace(html, "", "", 1) // Add links back to HTMLhouse watermark := "" if strings.Index(html, "") == -1 { html = strings.Replace(html, "", "", 1) } html = strings.Replace(html, "", fmt.Sprintf("%sHTMLlot.