212 lines
4.4 KiB
Go
212 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"html/template"
|
|
"io/ioutil"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"path"
|
|
"time"
|
|
|
|
"github.com/VictorAvelar/mollie-api-go/mollie"
|
|
"gopkg.in/yaml.v2"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/jinzhu/gorm"
|
|
)
|
|
|
|
type Config struct {
|
|
MollieToken string `yaml:"mollie_token"`
|
|
MollieTesting bool `yaml:"mollie_testing"`
|
|
MollieWebhook string `yaml:"mollie_webhook"`
|
|
MollieRedirectURL string `yaml:"mollie_redirect_url"`
|
|
MailServer string `yaml:"mail_server"`
|
|
MailPort int `yaml:"mail_port"`
|
|
MailUser string `yaml:"mail_user"`
|
|
MailPass string `yaml:"mail_pass"`
|
|
FromAddr string `yaml:"from_addr"`
|
|
BCC string `yaml:"bcc"`
|
|
}
|
|
|
|
var config Config
|
|
|
|
var mollieClient *mollie.Client
|
|
|
|
var ROOT_DIR string
|
|
|
|
func notFound(w http.ResponseWriter, r *http.Request) error {
|
|
w.WriteHeader(http.StatusNotFound)
|
|
|
|
t, err := template.ParseFiles(path.Join(ROOT_DIR, "templates/404.html"))
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return t.Execute(w, nil)
|
|
}
|
|
|
|
func index(c *gin.Context) {
|
|
events := getEvents("loveit")
|
|
tomEvents := getEvents("tom_waits")
|
|
|
|
c.HTML(http.StatusOK, "index.html", map[string]interface{}{
|
|
"events": events,
|
|
"tomEvents": tomEvents,
|
|
"nowYear": time.Now().Format("2006"),
|
|
})
|
|
}
|
|
|
|
func loveIt(c *gin.Context) {
|
|
c.Redirect(http.StatusFound, "/")
|
|
}
|
|
|
|
func albumsHandler(c *gin.Context) {
|
|
albums := getAlbums()
|
|
|
|
c.HTML(http.StatusOK, "albums.html", map[string]interface{}{
|
|
"nowYear": time.Now().Format("2006"),
|
|
"albums": albums,
|
|
})
|
|
}
|
|
|
|
func handle404(c *gin.Context) {
|
|
c.HTML(http.StatusOK, "404.html", map[string]interface{}{})
|
|
}
|
|
|
|
func songsHandler(c *gin.Context) {
|
|
albums := getAlbums()
|
|
albumTitle := c.Param("album")
|
|
songTitle := c.Param("song")
|
|
|
|
album, err := getAlbum(albums, albumTitle)
|
|
|
|
if err != nil {
|
|
c.HTML(http.StatusNotFound, "404.html", map[string]interface{}{})
|
|
return
|
|
}
|
|
|
|
song, err := getSong(album, songTitle)
|
|
|
|
if err != nil {
|
|
c.HTML(http.StatusNotFound, "404.html", map[string]interface{}{})
|
|
return
|
|
}
|
|
|
|
c.HTML(http.StatusOK, "song.html", map[string]interface{}{
|
|
"nowYear": time.Now().Format("2006"),
|
|
"album": album,
|
|
"song": song,
|
|
"albumTitle": albumTitle,
|
|
})
|
|
}
|
|
|
|
func createSocket(s string) net.Listener {
|
|
os.Remove(s)
|
|
|
|
log.Println("Creating UNIX socket:", s)
|
|
sock, err := net.Listen("unix", s)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
err = os.Chmod(s, 0777)
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return sock
|
|
}
|
|
|
|
func getDB(c *gin.Context) *gorm.DB {
|
|
item, _ := c.Get("db")
|
|
db := item.(*gorm.DB)
|
|
|
|
return db
|
|
}
|
|
|
|
func main() {
|
|
if len(os.Args) > 1 {
|
|
ROOT_DIR = os.Args[1]
|
|
} else {
|
|
ROOT_DIR = "/var/www/flipnew"
|
|
}
|
|
|
|
r := gin.New()
|
|
|
|
r.SetFuncMap(template.FuncMap{
|
|
"formatMoney": func(cents int) string {
|
|
return fmt.Sprintf("€%.2f", float64(float64(cents)/100))
|
|
},
|
|
})
|
|
|
|
log.Printf("Running from with app root dir: %s\n", ROOT_DIR)
|
|
|
|
db := GetDB()
|
|
defer db.Close()
|
|
|
|
configPath := path.Join(ROOT_DIR, "data/config/config.yaml")
|
|
configBytes, err := ioutil.ReadFile(configPath)
|
|
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Can't open config file at %s; %v", configPath, err))
|
|
}
|
|
|
|
if err := yaml.Unmarshal([]byte(configBytes), &config); err != nil {
|
|
panic(fmt.Sprintf("Can't parse config file at %s; %v", configPath, err))
|
|
}
|
|
|
|
if mollieClient, err = initMollie(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
r.LoadHTMLGlob(path.Join(ROOT_DIR, "templates/*.html"))
|
|
|
|
r.Use(func(c *gin.Context) {
|
|
c.Set("db", db)
|
|
c.Next()
|
|
})
|
|
|
|
if k, v := os.LookupEnv("RUN_STATIC"); v && k == "true" {
|
|
r.Static("/static", "./dist")
|
|
}
|
|
|
|
r.GET("/", index)
|
|
r.GET("/albums", albumsHandler)
|
|
r.GET("/albums/:album/:song", songsHandler)
|
|
r.GET("/love-it", loveIt)
|
|
r.GET("/preorder", preorderIndex)
|
|
r.POST("/preorder", postCreateOrder)
|
|
r.POST("/preorder/bestellen", postGetOrderInfo)
|
|
r.POST("/preorder/webhook", postMollieWebhook)
|
|
r.GET("/preorder/bedankt", getPreOrderThankYou)
|
|
r.POST("/preorder/retry/:orderid", postOrderRetry)
|
|
r.GET("/preorder/pending/:orderid", getPendingOrder)
|
|
r.NoRoute(handle404)
|
|
|
|
sockPath := path.Join(ROOT_DIR, "run/flip.sock")
|
|
sock := createSocket(sockPath)
|
|
|
|
server := http.Server{
|
|
Handler: r,
|
|
}
|
|
|
|
fmt.Println("Running...")
|
|
go func() {
|
|
log.Fatal(server.Serve(sock))
|
|
}()
|
|
|
|
c := make(chan os.Signal, 1)
|
|
signal.Notify(c, os.Interrupt)
|
|
|
|
// Block until a signal is received.
|
|
<-c
|
|
fmt.Println("Stopping...")
|
|
os.Remove(path.Join(ROOT_DIR, "run/flip.sock"))
|
|
}
|