Last active
February 29, 2016 10:52
-
-
Save andreinechaev/2578e4b71d25ad1d2318 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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