diff --git a/.drone.yml b/.drone.yml index 9fab517..900ef38 100644 --- a/.drone.yml +++ b/.drone.yml @@ -7,9 +7,14 @@ pipeline: pull: true commands: - mkdir -p /go/bin /go/src - - go get github.com/revel/cmd/revel - - revel build github.com/CyCoreSystems/cycore-web ../tmp prod - - mv ../tmp . + - go get -u github.com/golang/dep/cmd/dep/... + - go get -u github.com/alecthomas/gometalinter/... + - go get -u github.com/mjibson/esc + - dep ensure + - go generate + - gometalinter --install + - gometalinter --vendor ./... + - go build publish: image: plugins/docker:17.05 repo: quay.io/cycore/web diff --git a/.gitignore b/.gitignore index fe69af1..7f646c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ -test-results/ -tmp/ -routes/ /vendor/ +/cycore-web diff --git a/Dockerfile b/Dockerfile index 074a9fd..88d6799 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,3 @@ FROM ulexus/go-minimal -COPY tmp/cycore-web /app -COPY tmp/src /src +COPY cycore-web /app +COPY assets /assets diff --git a/Gopkg.lock b/Gopkg.lock new file mode 100644 index 0000000..a67db44 --- /dev/null +++ b/Gopkg.lock @@ -0,0 +1,99 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/CyCoreSystems/sendinblue" + packages = ["."] + revision = "9b851c8f8e26b6bfc746aaa0dbaf8f7a78286ee0" + version = "v0.1.1" + +[[projects]] + name = "github.com/dgrijalva/jwt-go" + packages = ["."] + revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e" + version = "v3.2.0" + +[[projects]] + branch = "master" + name = "github.com/jmoiron/sqlx" + packages = [".","reflectx"] + revision = "2aeb6a910c2b94f2d5eb53d9895d80e27264ec41" + +[[projects]] + name = "github.com/labstack/echo" + packages = [".","middleware"] + revision = "6d227dfea4d2e52cb76856120b3c17f758139b4e" + version = "3.3.5" + +[[projects]] + name = "github.com/labstack/gommon" + packages = ["bytes","color","log","random"] + revision = "588f4e8bddc6cb45c27b448e925c7fd6a5545434" + version = "0.2.5" + +[[projects]] + branch = "master" + name = "github.com/lib/pq" + packages = [".","oid"] + revision = "d34b9ff171c21ad295489235aec8b6626023cd04" + +[[projects]] + name = "github.com/mattn/go-colorable" + packages = ["."] + revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" + version = "v0.0.9" + +[[projects]] + name = "github.com/mattn/go-isatty" + packages = ["."] + revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" + version = "v0.0.3" + +[[projects]] + branch = "master" + name = "github.com/valyala/bytebufferpool" + packages = ["."] + revision = "e746df99fe4a3986f4d4f79e13c1e0117ce9c2f7" + +[[projects]] + branch = "master" + name = "github.com/valyala/fasttemplate" + packages = ["."] + revision = "dcecefd839c4193db0d35b88ec65b4c12d360ab0" + +[[projects]] + name = "go.uber.org/atomic" + packages = ["."] + revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289" + version = "v1.3.2" + +[[projects]] + name = "go.uber.org/multierr" + packages = ["."] + revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" + version = "v1.1.0" + +[[projects]] + name = "go.uber.org/zap" + packages = [".","buffer","internal/bufferpool","internal/color","internal/exit","zapcore"] + revision = "eeedf312bc6c57391d84767a4cd413f02a917974" + version = "v1.8.0" + +[[projects]] + branch = "master" + name = "golang.org/x/crypto" + packages = ["acme","acme/autocert"] + revision = "1a580b3eff7814fc9b40602fd35256c63b50f491" + +[[projects]] + branch = "master" + name = "golang.org/x/sys" + packages = ["unix"] + revision = "7c87d13f8e835d2fb3a70a2912c811ed0c1d241b" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "663f98ffe10e2e1074511774007b7ec79196f112e44ab874c8e209c2ee0d9453" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml new file mode 100644 index 0000000..3ccce21 --- /dev/null +++ b/Gopkg.toml @@ -0,0 +1,42 @@ + +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" + + +[[constraint]] + name = "github.com/CyCoreSystems/sendinblue" + version = "0.1.1" + +[[constraint]] + branch = "master" + name = "github.com/jmoiron/sqlx" + +[[constraint]] + name = "github.com/labstack/echo" + version = "3.3.5" + +[[constraint]] + branch = "master" + name = "github.com/lib/pq" + +[[constraint]] + name = "go.uber.org/zap" + version = "1.8.0" diff --git a/app/controllers/app.go b/app/controllers/app.go deleted file mode 100644 index e76d76b..0000000 --- a/app/controllers/app.go +++ /dev/null @@ -1,11 +0,0 @@ -package controllers - -import "github.com/revel/revel" - -type App struct { - *revel.Controller -} - -func (c App) Index() revel.Result { - return c.Render() -} diff --git a/app/controllers/contact.go b/app/controllers/contact.go deleted file mode 100644 index 342a5e8..0000000 --- a/app/controllers/contact.go +++ /dev/null @@ -1,116 +0,0 @@ -package controllers - -import ( - "bytes" - "encoding/json" - "html/template" - "os" - "time" - - "github.com/CyCoreSystems/cycore-web/app/routes" - "github.com/CyCoreSystems/sendinblue" - "github.com/revel/revel" -) - -var contactEmailT *template.Template - -func init() { - contactEmailT = template.Must(template.New("contactEmail").Parse(contactEmailTemplate)) -} - -// Contact controller handles customer contact operations -type Contact struct { - *revel.Controller -} - -// ContactRequest handles a customer contact request -func (c Contact) ContactRequest(name, email string) revel.Result { - - c.Log.Info("received contact request", "name", name, "email", email, "source", c.ClientIP) - - if name == "" { - c.Flash.Error("Please supply a name") - return c.Redirect(routes.App.Index()) - } - if email == "" { - c.Flash.Error("Please supply an email address") - return c.Redirect(routes.App.Index()) - } - - emailBody, err := c.renderContactEmail(name, email) - if err != nil { - c.Log.Error("failed to render contact email", "error", err) - c.Flash.Error("Internal error encountered; please try again") - return c.Redirect(routes.App.Index()) - } - - msg := &sendinblue.Message{ - Sender: &sendinblue.Address{ - Name: "CyCore Systems, Inc", - Email: "sys@cycoresys.com", - }, - To: c.getEmailContacts(), - Subject: "Contact Request", - HTMLContent: emailBody, - Tags: []string{"contact-request"}, - } - if err = msg.Send(os.Getenv("SENDINBLUE_APIKEY")); err != nil { - c.Log.Error("failed to send contact email", "error", err) - c.Flash.Error("Request failed") - - enc := json.NewEncoder(os.Stdout) - enc.SetIndent("", " ") - enc.Encode(msg) - - return c.Redirect(routes.App.Index()) - } - - c.Flash.Success("Request sent") - return c.Redirect(routes.App.Index()) -} - -func (c Contact) renderContactEmail(name, email string) (string, error) { - buf := new(bytes.Buffer) - err := contactEmailT.Execute(buf, struct { - Name string - Email string - Timestamp string - }{ - Name: name, - Email: email, - Timestamp: time.Now().String(), - }) - if err != nil { - return "", err - } - return buf.String(), nil -} - -func (c Contact) getEmailContacts() []*sendinblue.Address { - - var ret []*sendinblue.Address - if err := json.Unmarshal([]byte(os.Getenv("CONTACT_RECIPIENTS")), &ret); err != nil { - - // Fall back to default if we fail to load from environment - c.Log.Warn("failed to load recipients from environment", "error", err) - ret = append(ret, &sendinblue.Address{ - Name: "System Receiver", - Email: "sys@cycoresys.com", - }) - - } - return ret -} - -var contactEmailTemplate = ` - -
-