summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/app.go11
-rw-r--r--app/controllers/db.go43
-rw-r--r--app/controllers/url.go28
-rw-r--r--app/init.go38
-rw-r--r--app/views/App/Index.html23
-rw-r--r--app/views/debug.html64
-rw-r--r--app/views/errors/404.html20
-rw-r--r--app/views/errors/500.html16
-rw-r--r--app/views/flash.html18
-rw-r--r--app/views/footer.html5
-rw-r--r--app/views/header.html17
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>