autosklo/main.go

112 lines
2.9 KiB
Go

package main
import (
"context"
"encoding/json"
"fmt"
"html/template"
"io"
"log"
"net/http"
"strings"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
uuid "github.com/satori/go.uuid"
)
type Template struct {
templates *template.Template
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
func main() {
e := echo.New()
e.Use(middleware.Logger())
t := &Template{
templates: template.Must(template.ParseGlob("src/templates/*.html")),
}
e.Renderer = t
e.Static("/static", "src/static")
e.Static("/dist", "dist/")
e.GET("/", HomeHandler)
e.POST("/", HomeHandler)
e.Logger.Fatal(e.Start(":1323"))
}
func HomeHandler(c echo.Context) error {
config := getConfig()
if c.Request().Method == "POST" {
message := Message{
Name: c.FormValue("name"),
Phone: c.FormValue("phone"),
Email: c.FormValue("email"),
Service: c.FormValue("service"),
Note: c.FormValue("note"),
VIN: c.FormValue("vin"),
}
// Validate
message.Validate()
if message.Errors > 0 {
return c.Render(http.StatusOK, "index.html", Response{Error: "Opravte prosím chyby ve formuláři", Message: message})
}
// Store
client, err := getDBClient()
if err != nil {
return c.Render(http.StatusOK, "index.html", Response{Error: err.Error(), Message: message})
}
db := client.DB(context.TODO(), config.CouchDBName)
if err != nil {
return c.Render(http.StatusOK, "index.html", Response{Error: err.Error(), Message: message})
}
body, err := json.Marshal(message)
if err != nil {
return c.Render(http.StatusOK, "index.html", Response{Error: err.Error(), Message: message})
}
messageUUID := uuid.NewV4()
_, err = db.Put(context.TODO(), strings.Replace(messageUUID.String(), "-", "", -1), body)
if err != nil {
return c.Render(http.StatusOK, "index.html", Response{Error: err.Error(), Message: message})
}
go func() {
msg := "Zpráva z rezervačního formuláře\n\n"
msg += fmt.Sprintf(" Jméno: %s\n", message.Name)
msg += fmt.Sprintf(" Telefon: %s\n", message.Phone)
if message.Email != "" {
msg += fmt.Sprintf(" Email: %s\n", message.Email)
}
if message.Email != "" {
msg += fmt.Sprintf(" Služba: %s\n", message.Service)
}
if message.Email != "" {
msg += fmt.Sprintf(" VIN: %s\n", message.VIN)
}
if message.Email != "" {
msg += fmt.Sprintf("\nPoznámka:\n\n%s\n", message.Note)
}
err := sendEmail(config.SMTPHostname, config.SMTPUsername, config.SMTPPassword, config.EmailTo, config.EmailFrom, config.EmailSubject, msg, config.SMTPPort)
if err != nil {
log.Println("SMTP ERROR:", err)
}
}()
return c.Redirect(http.StatusFound, "/?message=Zpráva odeslána")
}
return c.Render(http.StatusOK, "index.html", Response{StatusMessage: c.QueryParam("message")})
}