package main import ( "fmt" "log" "net/http" "os" "path/filepath" "time" "arimelody.me/arimelody.me/admin" "arimelody.me/arimelody.me/api" "arimelody.me/arimelody.me/global" musicController "arimelody.me/arimelody.me/music/controller" musicView "arimelody.me/arimelody.me/music/view" "github.com/jmoiron/sqlx" _ "github.com/lib/pq" ) const DEFAULT_PORT int = 8080 func main() { // initialise database connection var err error global.DB, err = sqlx.Connect("postgres", "user=arimelody dbname=arimelody password=fuckingpassword sslmode=disable") if err != nil { fmt.Fprintf(os.Stderr, "unable to create database connection pool: %v\n", err) os.Exit(1) } global.DB.SetConnMaxLifetime(time.Minute * 3) global.DB.SetMaxOpenConns(10) global.DB.SetMaxIdleConns(10) defer global.DB.Close() // pull artist data from DB global.Artists, err = musicController.PullAllArtists(global.DB) if err != nil { fmt.Printf("Failed to pull artists from database: %v\n", err); panic(1) } fmt.Printf("%d artists loaded successfully.\n", len(global.Artists)) // pull release data from DB global.Releases, err = musicController.PullAllReleases(global.DB) if err != nil { fmt.Printf("Failed to pull releases from database: %v\n", err); panic(1) } fmt.Printf("%d releases loaded successfully.\n", len(global.Releases)) // pull track data from DB global.Tracks, err = musicController.PullAllTracks(global.DB) if err != nil { fmt.Printf("Failed to pull tracks from database: %v\n", err); panic(1) } fmt.Printf("%d tracks loaded successfully.\n", len(global.Tracks)) // start the web server! mux := createServeMux() port := DEFAULT_PORT fmt.Printf("now serving at http://127.0.0.1:%d\n", port) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), global.HTTPLog(mux))) } func createServeMux() *http.ServeMux { mux := http.NewServeMux() mux.Handle("/admin/", http.StripPrefix("/admin", admin.Handler())) mux.Handle("/api/", http.StripPrefix("/api", api.Handler())) mux.Handle("/music/", http.StripPrefix("/music", musicView.Handler())) mux.Handle("/uploads/", http.StripPrefix("/uploads", staticHandler("uploads"))) mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" || r.URL.Path == "/index.html" { global.ServeTemplate("index.html", nil).ServeHTTP(w, r) return } staticHandler("public").ServeHTTP(w, r) })) return mux } func staticHandler(directory string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { info, err := os.Stat(filepath.Join(directory, filepath.Clean(r.URL.Path))) // does the file exist? if err != nil { if os.IsNotExist(err) { http.NotFound(w, r) return } } // is thjs a directory? (forbidden) if info.IsDir() { http.NotFound(w, r) return } http.FileServer(http.Dir(directory)).ServeHTTP(w, r) }) }