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) 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", server.Products).Methods("GET") server.Router.HandleFunc("/products/{slug}", server.GetProductByID).Methods("GET") server.Router.HandleFunc("/section/{id}", server.SelectSection).Methods("GET") staticFileDirectory := http.Dir("./assets/") staticFileHandler := http.StripPrefix("/public/", http.FileServer(staticFileDirectory)) server.Router.PathPrefix("/public/").Handler(staticFileHandler).Methods("GET") }