195 lines
4.8 KiB
Go
195 lines
4.8 KiB
Go
package controllers
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/gorilla/mux"
|
|
"github.com/gorilla/sessions"
|
|
"github.com/urfave/cli"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
"log"
|
|
"moretcgshop/app/models"
|
|
"moretcgshop/database/seeders"
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
type Server struct {
|
|
DB *gorm.DB
|
|
Router *mux.Router
|
|
AppConfig *AppConfig
|
|
}
|
|
|
|
type AppConfig struct {
|
|
AppName string
|
|
AppEnv string
|
|
AppPort string
|
|
AppURL string
|
|
}
|
|
|
|
type DBConfig struct {
|
|
DBHost string
|
|
DBUser string
|
|
DBPassword string
|
|
DBName string
|
|
DBPort string
|
|
DBDriver string
|
|
}
|
|
|
|
var store = sessions.NewCookieStore([]byte("DamianFinja")) //os.Getenv("SESSION_KEY")))
|
|
var sessionShoppingCart = "shopping-cart-session"
|
|
var sessionFlash = "flash-session"
|
|
var sessionUser = "user-session"
|
|
|
|
func (server *Server) Initialize(appConfig AppConfig, dbConfig DBConfig) {
|
|
fmt.Println("Willkommen zu " + appConfig.AppName)
|
|
|
|
server.initializeDB(dbConfig)
|
|
server.initializeAppConfig(appConfig)
|
|
server.routeInit()
|
|
}
|
|
|
|
func SetFlash(w http.ResponseWriter, r *http.Request, name string, value string) {
|
|
session, err := store.Get(r, sessionFlash)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
session.AddFlash(value, name)
|
|
err = session.Save(r, w)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
}
|
|
}
|
|
|
|
func GetFlash(w http.ResponseWriter, r *http.Request, name string) []string {
|
|
session, err := store.Get(r, sessionFlash)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return nil
|
|
}
|
|
fm := session.Flashes(name)
|
|
if len(fm) < 0 {
|
|
return nil
|
|
}
|
|
|
|
session.Save(r, w)
|
|
var flashes []string
|
|
for _, fl := range fm {
|
|
flashes = append(flashes, fl.(string))
|
|
}
|
|
return flashes
|
|
}
|
|
|
|
func (server *Server) Run(addr string) {
|
|
fmt.Printf("Listening to port %s", addr)
|
|
println("")
|
|
log.Fatal(http.ListenAndServe(addr, server.Router))
|
|
}
|
|
|
|
func (server *Server) InitCommands(config AppConfig, dbConfig DBConfig) {
|
|
server.initializeDB(dbConfig)
|
|
cmdApp := cli.NewApp()
|
|
cmdApp.Commands = []cli.Command{
|
|
{
|
|
Name: "db:seed",
|
|
Action: func(c *cli.Context) error {
|
|
err := seeders.DBSeed(server.DB)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
}
|
|
|
|
err := cmdApp.Run(os.Args)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func MakePassword(password string) (string, error) {
|
|
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
return string(hashedPassword), err
|
|
}
|
|
|
|
func ComparePassword(password string, hashedPassword string) bool {
|
|
return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password)) == nil
|
|
}
|
|
|
|
func (server *Server) initializeDB(dbConfig DBConfig) {
|
|
var err error
|
|
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Jakarta", dbConfig.DBHost, dbConfig.DBUser, dbConfig.DBPassword, dbConfig.DBName, dbConfig.DBPort)
|
|
server.DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
|
|
if err != nil {
|
|
panic("Failed on connecting to the database server")
|
|
}
|
|
server.dbMigrate()
|
|
}
|
|
func (server *Server) dbMigrate() {
|
|
for _, model := range models.RegisterModels() {
|
|
err := server.DB.Debug().AutoMigrate(model.Model)
|
|
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
fmt.Println("Database migrated successfully.")
|
|
}
|
|
|
|
func (server *Server) initializeAppConfig(config AppConfig) {
|
|
server.AppConfig = &config
|
|
}
|
|
|
|
func IsLoggedIn(r *http.Request) bool {
|
|
session, _ := store.Get(r, sessionUser)
|
|
if session.Values["id"] == nil {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (server *Server) CurrentUser(w http.ResponseWriter, r *http.Request) *models.User {
|
|
if !IsLoggedIn(r) {
|
|
return nil
|
|
}
|
|
|
|
session, _ := store.Get(r, sessionUser)
|
|
|
|
userModel := models.User{}
|
|
|
|
user, err := userModel.FindByID(server.DB, session.Values["id"].(string))
|
|
if err != nil {
|
|
session.Values["id"] = nil
|
|
session.Save(r, w)
|
|
return nil
|
|
}
|
|
|
|
return user
|
|
}
|
|
|
|
func (server *Server) routeInit() {
|
|
server.Router = mux.NewRouter()
|
|
server.Router.HandleFunc("/", server.Home).Methods("GET")
|
|
|
|
server.Router.HandleFunc("/login", server.Login).Methods("GET")
|
|
server.Router.HandleFunc("/login", server.DoLogin).Methods("POST")
|
|
|
|
server.Router.HandleFunc("/register", server.Register).Methods("GET")
|
|
server.Router.HandleFunc("/register", server.DoRegister).Methods("POST")
|
|
server.Router.HandleFunc("/logout", server.Logout).Methods("GET")
|
|
|
|
server.Router.HandleFunc("/products/cat/{id}", server.ProductsByCategory).Methods("GET")
|
|
server.Router.HandleFunc("/products/{slug}", server.GetProductByID).Methods("GET")
|
|
|
|
server.Router.HandleFunc("/section/{id}", server.Categories).Methods("GET")
|
|
|
|
staticFileDirectory := http.Dir("./assets/")
|
|
staticFileHandler := http.StripPrefix("/public/", http.FileServer(staticFileDirectory))
|
|
server.Router.PathPrefix("/public/").Handler(staticFileHandler).Methods("GET")
|
|
}
|