From 09f094312ed92adf998d8f6c2cfe9e7a86b5e818 Mon Sep 17 00:00:00 2001 From: Hunter Long Date: Thu, 9 Aug 2018 22:38:54 -0600 Subject: [PATCH 01/26] service fix - source assets - fixes --- .travis.yml | 12 ++++++------ .travis/compile.sh | 4 ++-- cmd/cli.go | 9 +++++---- cmd/main.go | 3 ++- cmd/main_test.go | 15 ++++++++------- core/assets.go | 33 +++++++++++++-------------------- core/core.go | 6 ------ core/core_test.go | 29 ++++++++++++++--------------- core/database.go | 7 ++++--- core/export.go | 7 ++++--- handlers/handlers.go | 9 +++++---- handlers/handlers_test.go | 11 ++++++++++- handlers/routes.go | 11 +++++++---- handlers/services.go | 4 ++++ handlers/settings.go | 3 ++- source/source.go | 19 +++++++++++++++++++ source/tmpl/login.html | 2 +- source/tmpl/setup.html | 2 ++ source/tmpl/statup.png | Bin 0 -> 26528 bytes 19 files changed, 108 insertions(+), 78 deletions(-) create mode 100644 source/source.go create mode 100644 source/tmpl/statup.png diff --git a/.travis.yml b/.travis.yml index 2a6f4667..48055c1b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,12 +18,12 @@ services: env: global: - - VERSION=0.36 - - DB_HOST=localhost - - DB_USER=travis - - DB_PASS= - - DB_DATABASE=test - - GO_ENV=test + - VERSION=0.36 + - DB_HOST=localhost + - DB_USER=travis + - DB_PASS= + - DB_DATABASE=test + - GO_ENV=test matrix: allow_failures: diff --git a/.travis/compile.sh b/.travis/compile.sh index a05d4f6d..d28a4885 100755 --- a/.travis/compile.sh +++ b/.travis/compile.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash -cd $GOPATH/src/github.com/hunterlong/statup/core +cd $GOPATH/src/github.com/hunterlong/statup/source # RENDERING CSS gem install sass -sass ../source/scss/base.scss ../source/css/base.css +sass scss/base.scss css/base.css # MIGRATION SQL FILE FOR CURRENT VERSION #printf "UPDATE core SET version='$VERSION';\n" >> source/sql/upgrade.sql diff --git a/cmd/cli.go b/cmd/cli.go index 70459551..88bd7d26 100644 --- a/cmd/cli.go +++ b/cmd/cli.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "github.com/hunterlong/statup/core" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/types" "github.com/hunterlong/statup/utils" "github.com/joho/godotenv" @@ -27,7 +28,7 @@ func CatchCLI(args []string) { case "version": fmt.Printf("Statup v%v\n", VERSION) case "assets": - core.RenderBoxes() + source.Assets() core.CreateAllAssets(dir) case "sass": core.CompileSASS(dir) @@ -52,7 +53,7 @@ func CatchCLI(args []string) { case "export": var err error fmt.Printf("Statup v%v Exporting Static 'index.html' page...\n", VERSION) - core.RenderBoxes() + source.Assets() core.Configs, err = core.LoadConfig() if err != nil { utils.Log(4, "config.yml file not found") @@ -126,7 +127,7 @@ func HelpEcho() { func TestPlugin(plug types.PluginActions) { defer utils.DeleteFile("./.plugin_test.db") - core.RenderBoxes() + source.Assets() info := plug.GetInfo() fmt.Printf("\n" + BRAKER + "\n") @@ -191,7 +192,7 @@ func FakeSeed(plug types.PluginActions) { if err != nil { utils.Log(3, err) } - up, _ := core.SqlBox.String("sqlite_up.sql") + up, _ := source.SqlBox.String("sqlite_up.sql") requests := strings.Split(up, ";") for _, request := range requests { _, err := core.DbSession.Exec(request) diff --git a/cmd/main.go b/cmd/main.go index aba0fa47..d9e227e8 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -5,6 +5,7 @@ import ( "github.com/fatih/structs" "github.com/hunterlong/statup/core" "github.com/hunterlong/statup/handlers" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/types" "github.com/hunterlong/statup/utils" "github.com/joho/godotenv" @@ -33,7 +34,7 @@ func main() { os.Exit(0) } utils.Log(1, fmt.Sprintf("Starting Statup v%v", VERSION)) - core.RenderBoxes() + source.Assets() core.HasAssets(directory) core.Configs, err = core.LoadConfig() diff --git a/cmd/main_test.go b/cmd/main_test.go index d6e92207..e06efcfb 100644 --- a/cmd/main_test.go +++ b/cmd/main_test.go @@ -6,6 +6,7 @@ import ( "github.com/hunterlong/statup/core" "github.com/hunterlong/statup/handlers" "github.com/hunterlong/statup/notifiers" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/types" "github.com/hunterlong/statup/utils" "github.com/rendon/testcli" @@ -29,7 +30,7 @@ func init() { } func RunInit(t *testing.T) { - core.RenderBoxes() + source.Assets() os.Remove(dir + "/statup.db") os.Remove(dir + "/cmd/config.yml") os.Remove(dir + "/cmd/index.html") @@ -39,9 +40,9 @@ func RunInit(t *testing.T) { } func TestRunAll(t *testing.T) { - t.Parallel() + //t.Parallel() - databases := []string{"mysql", "sqlite", "postgres"} + databases := []string{"sqlite", "postgres", "mysql"} for _, dbt := range databases { @@ -192,10 +193,10 @@ func TestAssetsCommand(t *testing.T) { c := testcli.Command("statup", "assets") c.Run() t.Log(c.Stdout()) - assert.True(t, fileExists(dir+"/assets/robots.txt")) - assert.True(t, fileExists(dir+"/assets/js/main.js")) - assert.True(t, fileExists(dir+"/assets/css/base.css")) - assert.True(t, fileExists(dir+"/assets/scss/base.scss")) + t.Log("Directory for Assets: ", dir) + assert.True(t, fileExists("../assets/robots.txt")) + assert.True(t, fileExists("../assets/js/main.js")) + assert.True(t, fileExists("../assets/scss/base.scss")) } func RunMakeDatabaseConfig(t *testing.T, db string) { diff --git a/core/assets.go b/core/assets.go index 9452b6a5..071ce80d 100644 --- a/core/assets.go +++ b/core/assets.go @@ -3,20 +3,13 @@ package core import ( "fmt" "github.com/GeertJohan/go.rice" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/utils" "io/ioutil" "os" "os/exec" ) -func RenderBoxes() { - SqlBox = rice.MustFindBox("../source/sql") - CssBox = rice.MustFindBox("../source/css") - ScssBox = rice.MustFindBox("../source/scss") - JsBox = rice.MustFindBox("../source/js") - TmplBox = rice.MustFindBox("../source/tmpl") -} - func CopyToPublic(box *rice.Box, folder, file string) { assetFolder := fmt.Sprintf("%v/%v", folder, file) utils.Log(1, fmt.Sprintf("Copying %v to %v", file, assetFolder)) @@ -72,7 +65,7 @@ func HasAssets(folder string) bool { CreateAllAssets(folder) err := CompileSASS(folder) if err != nil { - CopyToPublic(CssBox, folder+"/css", "base.css") + CopyToPublic(source.CssBox, folder+"/css", "base.css") utils.Log(2, "Default 'base.css' was insert because SASS did not work.") return true } @@ -107,17 +100,17 @@ func CreateAllAssets(folder string) error { MakePublicFolder(folder + "/assets/css") MakePublicFolder(folder + "/assets/scss") utils.Log(1, "Inserting scss, css, and javascript files into assets folder") - CopyToPublic(ScssBox, folder+"/assets/scss", "base.scss") - CopyToPublic(ScssBox, folder+"/assets/scss", "variables.scss") - CopyToPublic(CssBox, folder+"/assets/css", "bootstrap.min.css") - CopyToPublic(CssBox, folder+"/assets/css", "base.css") - CopyToPublic(JsBox, folder+"/assets/js", "bootstrap.min.js") - CopyToPublic(JsBox, folder+"/assets/js", "Chart.bundle.min.js") - CopyToPublic(JsBox, folder+"/assets/js", "jquery-3.3.1.slim.min.js") - CopyToPublic(JsBox, folder+"/assets/js", "main.js") - CopyToPublic(JsBox, folder+"/assets/js", "setup.js") - CopyToPublic(TmplBox, folder+"/assets", "robots.txt") - CopyToPublic(TmplBox, folder+"/assets", "favicon.ico") + CopyToPublic(source.ScssBox, folder+"/assets/scss", "base.scss") + CopyToPublic(source.ScssBox, folder+"/assets/scss", "variables.scss") + CopyToPublic(source.CssBox, folder+"/assets/css", "bootstrap.min.css") + CopyToPublic(source.CssBox, folder+"/assets/css", "base.css") + CopyToPublic(source.JsBox, folder+"/assets/js", "bootstrap.min.js") + CopyToPublic(source.JsBox, folder+"/assets/js", "Chart.bundle.min.js") + CopyToPublic(source.JsBox, folder+"/assets/js", "jquery-3.3.1.slim.min.js") + CopyToPublic(source.JsBox, folder+"/assets/js", "main.js") + CopyToPublic(source.JsBox, folder+"/assets/js", "setup.js") + CopyToPublic(source.TmplBox, folder+"/assets", "robots.txt") + CopyToPublic(source.TmplBox, folder+"/assets", "statup.png") utils.Log(1, "Compiling CSS from SCSS style...") err := utils.Log(1, "Statup assets have been inserted") return err diff --git a/core/core.go b/core/core.go index 1f810cb3..d98219f8 100644 --- a/core/core.go +++ b/core/core.go @@ -1,7 +1,6 @@ package core import ( - "github.com/GeertJohan/go.rice" "github.com/hunterlong/statup/notifiers" "github.com/hunterlong/statup/types" "github.com/pkg/errors" @@ -20,11 +19,6 @@ type Core struct { var ( Configs *types.Config CoreApp *Core - SqlBox *rice.Box - CssBox *rice.Box - ScssBox *rice.Box - JsBox *rice.Box - TmplBox *rice.Box SetupMode bool UsingAssets bool VERSION string diff --git a/core/core_test.go b/core/core_test.go index d2792f51..209569fa 100644 --- a/core/core_test.go +++ b/core/core_test.go @@ -1,6 +1,7 @@ package core import ( + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/utils" "github.com/stretchr/testify/assert" "os" @@ -10,15 +11,13 @@ import ( var ( testCore *Core testConfig *DbConfig - gopath string + dir string ) func init() { - gopath = os.Getenv("GOPATH") - gopath += "/src/github.com/hunterlong/statup" - + dir = utils.Directory utils.InitLogs() - RenderBoxes() + source.Assets() } func TestNewCore(t *testing.T) { @@ -31,14 +30,14 @@ func TestDbConfig_Save(t *testing.T) { testConfig = &DbConfig{ DbConn: "sqlite", Project: "Tester", - Location: gopath, + Location: dir, } err := testConfig.Save() assert.Nil(t, err) } func TestDbConnection(t *testing.T) { - err := DbConnection(testConfig.DbConn, false, gopath) + err := DbConnection(testConfig.DbConn, false, dir) assert.Nil(t, err) } @@ -74,25 +73,25 @@ func TestCore_UsingAssets(t *testing.T) { } func TestHasAssets(t *testing.T) { - assert.False(t, HasAssets(gopath)) + assert.False(t, HasAssets(dir)) } func TestCreateAssets(t *testing.T) { - assert.Nil(t, CreateAllAssets(gopath)) - assert.True(t, HasAssets(gopath)) + assert.Nil(t, CreateAllAssets(dir)) + assert.True(t, HasAssets(dir)) } func TestCompileSASS(t *testing.T) { t.SkipNow() os.Setenv("SASS", "sass") - os.Setenv("CMD_FILE", gopath+"/cmd.sh") - assert.Nil(t, CompileSASS(gopath)) - assert.True(t, HasAssets(gopath)) + os.Setenv("CMD_FILE", dir+"/cmd.sh") + assert.Nil(t, CompileSASS(dir)) + assert.True(t, HasAssets(dir)) } func TestDeleteAssets(t *testing.T) { - assert.Nil(t, DeleteAllAssets(gopath)) - assert.False(t, HasAssets(gopath)) + assert.Nil(t, DeleteAllAssets(dir)) + assert.False(t, HasAssets(dir)) } func TestInsertNotifierDB(t *testing.T) { diff --git a/core/database.go b/core/database.go index a067ee44..05fece4a 100644 --- a/core/database.go +++ b/core/database.go @@ -3,6 +3,7 @@ package core import ( "fmt" "github.com/go-yaml/yaml" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/types" "github.com/hunterlong/statup/utils" "os" @@ -179,7 +180,7 @@ func RunDatabaseUpgrades() error { return err } utils.Log(1, fmt.Sprintf("Checking for Database Upgrades since #%v", currentMigration)) - upgrade, _ := SqlBox.String(CoreApp.DbConnection + "_upgrade.sql") + upgrade, _ := source.SqlBox.String(CoreApp.DbConnection + "_upgrade.sql") // parse db version and upgrade file ups := strings.Split(upgrade, "=========================================== ") ups = reverseSlice(ups) @@ -226,7 +227,7 @@ func RunDatabaseUpgrades() error { func DropDatabase() error { utils.Log(1, "Dropping Database Tables...") - down, err := SqlBox.String("down.sql") + down, err := source.SqlBox.String("down.sql") if err != nil { return err } @@ -248,7 +249,7 @@ func CreateDatabase() error { } else if CoreApp.DbConnection == "sqlite" { sql = "sqlite_up.sql" } - up, err := SqlBox.String(sql) + up, err := source.SqlBox.String(sql) requests := strings.Split(up, ";") for _, request := range requests { _, err := DbSession.Exec(request) diff --git a/core/export.go b/core/export.go index e372b476..9124f387 100644 --- a/core/export.go +++ b/core/export.go @@ -2,6 +2,7 @@ package core import ( "bytes" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/utils" "html/template" "io/ioutil" @@ -10,9 +11,9 @@ import ( func ExportIndexHTML() string { CoreApp.UseCdn = true //out := index{*CoreApp, CoreApp.Services} - nav, _ := TmplBox.String("nav.html") - footer, _ := TmplBox.String("footer.html") - render, err := TmplBox.String("index.html") + nav, _ := source.TmplBox.String("nav.html") + footer, _ := source.TmplBox.String("footer.html") + render, err := source.TmplBox.String("index.html") if err != nil { utils.Log(3, err) } diff --git a/handlers/handlers.go b/handlers/handlers.go index 370af2c4..9ef1b3a6 100644 --- a/handlers/handlers.go +++ b/handlers/handlers.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/gorilla/sessions" "github.com/hunterlong/statup/core" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/types" "github.com/hunterlong/statup/utils" "html/template" @@ -66,9 +67,9 @@ func IsAuthenticated(r *http.Request) bool { func ExecuteResponse(w http.ResponseWriter, r *http.Request, file string, data interface{}) { utils.Http(r) - nav, _ := core.TmplBox.String("nav.html") - footer, _ := core.TmplBox.String("footer.html") - render, err := core.TmplBox.String(file) + nav, _ := source.TmplBox.String("nav.html") + footer, _ := source.TmplBox.String("footer.html") + render, err := source.TmplBox.String(file) if err != nil { utils.Log(4, err) } @@ -100,7 +101,7 @@ func ExecuteResponse(w http.ResponseWriter, r *http.Request, file string, data i } func ExecuteJSResponse(w http.ResponseWriter, r *http.Request, file string, data interface{}) { - render, err := core.JsBox.String(file) + render, err := source.JsBox.String(file) if err != nil { utils.Log(4, err) } diff --git a/handlers/handlers_test.go b/handlers/handlers_test.go index ce906976..3a607623 100644 --- a/handlers/handlers_test.go +++ b/handlers/handlers_test.go @@ -2,6 +2,7 @@ package handlers import ( "github.com/hunterlong/statup/core" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/utils" "github.com/stretchr/testify/assert" "net/http" @@ -13,7 +14,7 @@ import ( func init() { utils.InitLogs() - core.RenderBoxes() + source.Assets() } func TestIndexHandler(t *testing.T) { @@ -84,6 +85,14 @@ func TestServicesViewHandler(t *testing.T) { assert.Contains(t, body, "Statup made with ❤️") } +func TestMissingServiceViewHandler(t *testing.T) { + req, err := http.NewRequest("GET", "/service/99999999", nil) + assert.Nil(t, err) + rr := httptest.NewRecorder() + Router().ServeHTTP(rr, req) + assert.Equal(t, 404, rr.Code) +} + func TestServiceChartHandler(t *testing.T) { req, err := http.NewRequest("GET", "/charts.js", nil) assert.Nil(t, err) diff --git a/handlers/routes.go b/handlers/routes.go index 7a5c74e2..1f85b864 100644 --- a/handlers/routes.go +++ b/handlers/routes.go @@ -5,6 +5,7 @@ import ( "github.com/gorilla/mux" "github.com/gorilla/sessions" "github.com/hunterlong/statup/core" + "github.com/hunterlong/statup/source" "net/http" "time" ) @@ -76,11 +77,13 @@ func LocalizedAssets(r *mux.Router) *mux.Router { r.PathPrefix("/js/").Handler(http.StripPrefix("/js/", jsHandler)) r.PathPrefix("/robots.txt").Handler(indexHandler) r.PathPrefix("/favicon.ico").Handler(indexHandler) + r.PathPrefix("/statup.png").Handler(indexHandler) } else { - r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(core.CssBox.HTTPBox()))) - r.PathPrefix("/js/").Handler(http.StripPrefix("/js/", http.FileServer(core.JsBox.HTTPBox()))) - r.PathPrefix("/robots.txt").Handler(http.FileServer(core.TmplBox.HTTPBox())) - r.PathPrefix("/favicon.ico").Handler(http.FileServer(core.TmplBox.HTTPBox())) + r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(source.CssBox.HTTPBox()))) + r.PathPrefix("/js/").Handler(http.StripPrefix("/js/", http.FileServer(source.JsBox.HTTPBox()))) + r.PathPrefix("/robots.txt").Handler(http.FileServer(source.TmplBox.HTTPBox())) + r.PathPrefix("/favicon.ico").Handler(http.FileServer(source.TmplBox.HTTPBox())) + r.PathPrefix("/statup.png").Handler(http.FileServer(source.TmplBox.HTTPBox())) } return r } diff --git a/handlers/services.go b/handlers/services.go index 39c2620a..8c9b0758 100644 --- a/handlers/services.go +++ b/handlers/services.go @@ -80,6 +80,10 @@ func ServicesDeleteHandler(w http.ResponseWriter, r *http.Request) { func ServicesViewHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) serv := core.SelectService(utils.StringInt(vars["id"])) + if serv == nil { + w.WriteHeader(http.StatusNotFound) + return + } ExecuteResponse(w, r, "service.html", serv) } diff --git a/handlers/settings.go b/handlers/settings.go index afb28313..0d8b9d36 100644 --- a/handlers/settings.go +++ b/handlers/settings.go @@ -5,6 +5,7 @@ import ( "github.com/gorilla/mux" "github.com/hunterlong/statup/core" "github.com/hunterlong/statup/notifiers" + "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/utils" "net/http" ) @@ -72,7 +73,7 @@ func SaveAssetsHandler(w http.ResponseWriter, r *http.Request) { core.CreateAllAssets(dir) err := core.CompileSASS(dir) if err != nil { - core.CopyToPublic(core.CssBox, dir+"/assets/css", "base.css") + core.CopyToPublic(source.CssBox, dir+"/assets/css", "base.css") utils.Log(2, "Default 'base.css' was insert because SASS did not work.") } core.UsingAssets = true diff --git a/source/source.go b/source/source.go new file mode 100644 index 00000000..aee287e4 --- /dev/null +++ b/source/source.go @@ -0,0 +1,19 @@ +package source + +import "github.com/GeertJohan/go.rice" + +var ( + SqlBox *rice.Box + CssBox *rice.Box + ScssBox *rice.Box + JsBox *rice.Box + TmplBox *rice.Box +) + +func Assets() { + SqlBox = rice.MustFindBox("sql") + CssBox = rice.MustFindBox("css") + ScssBox = rice.MustFindBox("scss") + JsBox = rice.MustFindBox("js") + TmplBox = rice.MustFindBox("tmpl") +} diff --git a/source/tmpl/login.html b/source/tmpl/login.html index c5cc1e7e..93fca9ba 100644 --- a/source/tmpl/login.html +++ b/source/tmpl/login.html @@ -19,7 +19,7 @@
-
+
{{ if .Error }}