diff options
Diffstat (limited to 'app')
| -rw-r--r-- | app/controllers/app.go | 11 | ||||
| -rw-r--r-- | app/controllers/db.go | 43 | ||||
| -rw-r--r-- | app/controllers/url.go | 28 | ||||
| -rw-r--r-- | app/init.go | 38 | ||||
| -rw-r--r-- | app/views/App/Index.html | 23 | ||||
| -rw-r--r-- | app/views/debug.html | 64 | ||||
| -rw-r--r-- | app/views/errors/404.html | 20 | ||||
| -rw-r--r-- | app/views/errors/500.html | 16 | ||||
| -rw-r--r-- | app/views/flash.html | 18 | ||||
| -rw-r--r-- | app/views/footer.html | 5 | ||||
| -rw-r--r-- | app/views/header.html | 17 |
11 files changed, 283 insertions, 0 deletions
diff --git a/app/controllers/app.go b/app/controllers/app.go new file mode 100644 index 0000000..e76d76b --- /dev/null +++ b/app/controllers/app.go @@ -0,0 +1,11 @@ +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/db.go b/app/controllers/db.go new file mode 100644 index 0000000..9607f24 --- /dev/null +++ b/app/controllers/db.go @@ -0,0 +1,43 @@ +package controllers + +import ( + "github.com/jinzhu/gorm" + _ "github.com/mattn/go-sqlite3" + "github.com/revel/revel" +) + +type User struct { + Id int64 + Email string + Name string + Password string +} + +type Job struct { +} + +var DB *gorm.DB + +func DBInit() *sql.DB { + // Open database handler + db, err := gorm.Open("sqlite3", "/tmp/gorm.db") + + // Ping database to check if up + if err = db.DB().Ping(); err != nil { + revel.ERROR.Panicf("Failed to init database. %s \n", err) + } + + // Set Pool connections + db.DB().SetMaxIdleConns(10) + db.DB().SetMaxOpenConns(100) + + // Create tables defined as struct + db.CreateTable(&User{}) + db.CreateTable(&Job{}) + + // Add index on email + db.Model(&User{}).AddIndex("idx_user_email", "email") + + // Make database handler public + DB = db +} diff --git a/app/controllers/url.go b/app/controllers/url.go new file mode 100644 index 0000000..516f6a6 --- /dev/null +++ b/app/controllers/url.go @@ -0,0 +1,28 @@ +package controllers + +import ( + "crypto/md5" + "fmt" + "io" + "io/ioutil" + "net/http" +) + +func HashUrl(url string) (string, error) { + response, err := http.Get(url) + if err != nil { + return "Get request failed.", err + } + + defer response.Body.Close() + contents, err := ioutil.ReadAll(response.Body) + if er != nil { + return "Reading body failed.", err + } + + h := md5.New() + io.WriteString(h, string(contents)) + hash := fmt.Sprintf("%x", h.Sum(nil)) + + return hash, nil +} diff --git a/app/init.go b/app/init.go new file mode 100644 index 0000000..2305d73 --- /dev/null +++ b/app/init.go @@ -0,0 +1,38 @@ +package app + +import "github.com/revel/revel" + +func init() { + // Filters is the default set of global filters. + revel.Filters = []revel.Filter{ + revel.PanicFilter, // Recover from panics and display an error page instead. + revel.RouterFilter, // Use the routing table to select the right Action + revel.FilterConfiguringFilter, // A hook for adding or removing per-Action filters. + revel.ParamsFilter, // Parse parameters into Controller.Params. + revel.SessionFilter, // Restore and write the session cookie. + revel.FlashFilter, // Restore and write the flash cookie. + revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie. + revel.I18nFilter, // Resolve the requested language + HeaderFilter, // Add some security based headers + revel.InterceptorFilter, // Run interceptors around the action. + revel.CompressFilter, // Compress the result. + revel.ActionInvoker, // Invoke the action. + } + + // register startup functions with OnAppStart + // ( order dependent ) + // revel.OnAppStart(InitDB) + // revel.OnAppStart(FillCache) +} + +// TODO turn this into revel.HeaderFilter +// should probably also have a filter for CSRF +// not sure if it can go in the same filter or not +var HeaderFilter = func(c *revel.Controller, fc []revel.Filter) { + // Add some common security headers + c.Response.Out.Header().Add("X-Frame-Options", "SAMEORIGIN") + c.Response.Out.Header().Add("X-XSS-Protection", "1; mode=block") + c.Response.Out.Header().Add("X-Content-Type-Options", "nosniff") + + fc[0](c, fc[1:]) // Execute the next filter stage. +} diff --git a/app/views/App/Index.html b/app/views/App/Index.html new file mode 100644 index 0000000..deb2304 --- /dev/null +++ b/app/views/App/Index.html @@ -0,0 +1,23 @@ +{{set . "title" "Home"}} +{{template "header.html" .}} + +<header class="hero-unit" style="background-color:#A9F16C"> + <div class="container"> + <div class="row"> + <div class="hero-text"> + <h1>It works!</h1> + <p></p> + </div> + </div> + </div> +</header> + +<div class="container"> + <div class="row"> + <div class="span6"> + {{template "flash.html" .}} + </div> + </div> +</div> + +{{template "footer.html" .}} diff --git a/app/views/debug.html b/app/views/debug.html new file mode 100644 index 0000000..f3975b7 --- /dev/null +++ b/app/views/debug.html @@ -0,0 +1,64 @@ +<style type="text/css"> + #sidebar { + position: absolute; + right: 0px; + top:69px; + max-width: 75%; + z-index: 1000; + background-color: #fee; + border: thin solid grey; + padding: 10px; + } + #toggleSidebar { + position: absolute; + right: 0px; + top: 50px; + background-color: #fee; + } + +</style> +<div id="sidebar" style="display:none;"> + <h4>Available pipelines</h4> + <dl> + {{ range $index, $value := .}} + <dt>{{$index}}</dt> + <dd>{{$value}}</dd> + {{end}} + </dl> + <h4>Flash</h4> + <dl> + {{ range $index, $value := .flash}} + <dt>{{$index}}</dt> + <dd>{{$value}}</dd> + {{end}} + </dl> + + <h4>Errors</h4> + <dl> + {{ range $index, $value := .errors}} + <dt>{{$index}}</dt> + <dd>{{$value}}</dd> + {{end}} + </dl> +</div> +<a id="toggleSidebar" href="#" class="toggles"><i class="icon-chevron-left"></i></a> + +<script> + $sidebar = 0; + $('#toggleSidebar').click(function() { + if ($sidebar === 1) { + $('#sidebar').hide(); + $('#toggleSidebar i').addClass('icon-chevron-left'); + $('#toggleSidebar i').removeClass('icon-chevron-right'); + $sidebar = 0; + } + else { + $('#sidebar').show(); + $('#toggleSidebar i').addClass('icon-chevron-right'); + $('#toggleSidebar i').removeClass('icon-chevron-left'); + $sidebar = 1; + } + + return false; + }); +</script> diff --git a/app/views/errors/404.html b/app/views/errors/404.html new file mode 100644 index 0000000..ebdfe10 --- /dev/null +++ b/app/views/errors/404.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <title>Not found</title> + </head> + <body> +{{if eq .RunMode "dev"}} +{{template "errors/404-dev.html" .}} +{{else}} + {{with .Error}} + <h1> + {{.Title}} + </h1> + <p> + {{.Description}} + </p> + {{end}} +{{end}} + </body> +</html> diff --git a/app/views/errors/500.html b/app/views/errors/500.html new file mode 100644 index 0000000..0cef4de --- /dev/null +++ b/app/views/errors/500.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> + <head> + <title>Application error</title> + </head> + <body> + {{if eq .RunMode "dev"}} + {{template "errors/500-dev.html" .}} + {{else}} + <h1>Oops, an error occured</h1> + <p> + This exception has been logged. + </p> + {{end}} + </body> +</html> diff --git a/app/views/flash.html b/app/views/flash.html new file mode 100644 index 0000000..9c9ade9 --- /dev/null +++ b/app/views/flash.html @@ -0,0 +1,18 @@ +{{if .flash.success}} +<div class="alert alert-success"> + {{.flash.success}} +</div> +{{end}} + +{{if or .errors .flash.error}} +<div class="alert alert-error"> + {{if .flash.error}} + {{.flash.error}} + {{end}} + <ul style="margin-top:10px;"> + {{range .errors}} + <li>{{.}}</li> + {{end}} + </ul> +</div> +{{end}} diff --git a/app/views/footer.html b/app/views/footer.html new file mode 100644 index 0000000..8db95e5 --- /dev/null +++ b/app/views/footer.html @@ -0,0 +1,5 @@ + {{if eq .RunMode "dev"}} + {{template "debug.html" .}} + {{end}} + </body> +</html> diff --git a/app/views/header.html b/app/views/header.html new file mode 100644 index 0000000..01637f4 --- /dev/null +++ b/app/views/header.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> + +<html> + <head> + <title>{{.title}}</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <link rel="stylesheet" type="text/css" href="/public/css/bootstrap.css"> + <link rel="shortcut icon" type="image/png" href="/public/img/favicon.png"> + <script src="/public/js/jquery-1.9.1.min.js" type="text/javascript" charset="utf-8"></script> + {{range .moreStyles}} + <link rel="stylesheet" type="text/css" href="/public/{{.}}"> + {{end}} + {{range .moreScripts}} + <script src="/public/{{.}}" type="text/javascript" charset="utf-8"></script> + {{end}} + </head> + <body> |
