Skip to content

Instantly share code, notes, and snippets.

@andreinechaev
Last active February 29, 2016 10:52
Show Gist options
  • Save andreinechaev/2578e4b71d25ad1d2318 to your computer and use it in GitHub Desktop.
Save andreinechaev/2578e4b71d25ad1d2318 to your computer and use it in GitHub Desktop.
package main
import (
"net/http"
"fmt"
"html/template"
"log"
"regexp"
"database/sql"
"github.com/mattn/go-sqlite3"
"strings"
)
const DB_NAME = "testersDB.sqlite"
var DB_DRIVER string
func init() {
var err error
sql.Register(DB_DRIVER, &sqlite3.SQLiteDriver{})
if err = initDB(); err != nil {
panic(err)
}
}
func acceptEmail(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Redirect(w, r, "/send", http.StatusMovedPermanently)
return
}
r.ParseForm()
email := r.Form["email"][0]
if validateEmail(email) {
if err := save(email); err != nil {
http.Redirect(w, r, "/send", http.StatusMovedPermanently)
panic(err)
}
}
http.Redirect(w, r, "/send", http.StatusMovedPermanently)
}
func main() {
http.HandleFunc("/", acceptEmail)
http.HandleFunc("/send", sendEmail)
if err := http.ListenAndServe(":8089", nil); err != nil {
panic(err)
}
}
func initDB() error {
db, err := sql.Open(DB_DRIVER, DB_NAME)
if err != nil {
return err
}
defer db.Close()
if err = db.Ping(); err != nil {
return err
}
if _, err = db.Begin(); err != nil {
return err
}
_, err = db.Exec(
"create table if not exists Testers " +
"(id integer primary key autoincrement," +
"name varchar(255)," +
"email varchar(255) not null unique)",
);
return err
}
func save(email string) error {
db, err := sql.Open(DB_DRIVER, DB_NAME)
if err != nil {
return err
}
defer db.Close()
name := strings.Split(email, "@")[0]
_, err = db.Exec(
"insert into Testers (name, email) values (?, ?)",
name,
email,
)
return err
}
//>>>>>>>>>>>>>>>>>>>>>>>> Tests <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
func sendEmail(w http.ResponseWriter, r *http.Request) {
render(w, "sendEmail.html")
}
func render(w http.ResponseWriter, tmpl string) {
w.Header().Set("Content-Type", "text/html")
tmpl = fmt.Sprintf("static/template/%s", tmpl)
t, err := template.ParseFiles(tmpl)
if err != nil {
log.Println("template parsing error: ", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
if err = t.Execute(w, nil); err != nil {
log.Println("template executing error: ", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func validateEmail(email string) bool {
re := regexp.MustCompile(".+@.+\\..+")
return re.Match([]byte(email))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment