From 224bbd7ade50acc267c67cba586f4de9761f39f5 Mon Sep 17 00:00:00 2001 From: Mirco Zeiss Date: Sun, 24 Jan 2016 10:50:59 +0100 Subject: [PATCH] meta lint --- config.go | 9 +++--- database.go | 14 ++++----- error.go | 9 +++--- item/item.go | 8 ++---- main.go | 80 +++++++++++++++++++++++++++++----------------------- template.go | 10 +++---- 6 files changed, 67 insertions(+), 63 deletions(-) diff --git a/config.go b/config.go index 7859bef..812c0a2 100644 --- a/config.go +++ b/config.go @@ -10,15 +10,14 @@ import ( const ip = "192.168.99.100" var ( - db Database - RediStore *redistore.RediStore + db database + rediStore *redistore.RediStore ) func init() { var err error // init redis for sessions - // fix hard coded ip to docker machine - RediStore, err = redistore.NewRediStore(10, "tcp", ip+":6379", "", []byte("secret-key")) + rediStore, err = redistore.NewRediStore(10, "tcp", ip+":6379", "", []byte("secret-key")) if err != nil { panic(err) } @@ -28,7 +27,7 @@ func init() { panic(err) } log.Println(client.Info()) - db = Database{ + db = database{ Client: client, } } diff --git a/database.go b/database.go index 3955265..81a81b4 100644 --- a/database.go +++ b/database.go @@ -9,7 +9,7 @@ import ( "github.com/zemirco/todo/item" ) -type Database struct { +type database struct { Client *couchdb.Client } @@ -21,7 +21,7 @@ const ( ) // CreateUser creates per user database and saves user document to _users database -func (d Database) CreateUser(user couchdb.User) error { +func (d database) CreateUser(user couchdb.User) error { // create per user database if _, err := d.Client.Create(user.Name); err != nil { return fmt.Errorf("create database: %v", err) @@ -57,7 +57,7 @@ function(doc) { } // SaveTodo saves todo item to CouchDB -func (d Database) SaveTodo(database string, todo *item.Todo) error { +func (d database) SaveTodo(database string, todo *item.Todo) error { db := d.Client.Use(database) if _, err := db.Post(todo); err != nil { return fmt.Errorf("post todo: %v", err) @@ -66,7 +66,7 @@ func (d Database) SaveTodo(database string, todo *item.Todo) error { } // GetTodos gets all todos from per user database -func (d Database) GetTodos(database string) ([]item.Todo, error) { +func (d database) GetTodos(database string) ([]item.Todo, error) { db := d.Client.Use(database) view := db.View("todo") params := couchdb.QueryParameters{ @@ -90,13 +90,13 @@ func (d Database) GetTodos(database string) ([]item.Todo, error) { return todos, json.Unmarshal(b, &todos) } -func (d Database) GetTodoByID(database, id string) (item.Todo, error) { +func (d database) GetTodoByID(database, id string) (item.Todo, error) { db := d.Client.Use(database) var t item.Todo return t, db.Get(&t, id) } -func (d Database) UpdateTodo(database string, todo item.Todo) error { +func (d database) UpdateTodo(database string, todo item.Todo) error { db := d.Client.Use(database) _, err := db.Put(&todo) if err != nil { @@ -105,7 +105,7 @@ func (d Database) UpdateTodo(database string, todo item.Todo) error { return nil } -func (d Database) DeleteTodoByID(database, id string) error { +func (d database) DeleteTodoByID(database, id string) error { db := d.Client.Use(database) // get document first to retrieve current revision doc, err := d.GetTodoByID(database, id) diff --git a/error.go b/error.go index 67f8e98..cf3f7cd 100644 --- a/error.go +++ b/error.go @@ -5,21 +5,22 @@ import ( "net/http" ) -type appError struct { +// AppError helps with http error handling +type AppError struct { Error error Message string Code int } -func InternalServerError(err error) *appError { - return &appError{ +func internalServerError(err error) *AppError { + return &AppError{ Error: err, Message: http.StatusText(http.StatusInternalServerError), Code: http.StatusInternalServerError, } } -type appHandler func(w http.ResponseWriter, r *http.Request) *appError +type appHandler func(w http.ResponseWriter, r *http.Request) *AppError func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if e := fn(w, r); e != nil { diff --git a/item/item.go b/item/item.go index 961655c..5fd70a4 100644 --- a/item/item.go +++ b/item/item.go @@ -1,10 +1,7 @@ package item -// Todo defines todo item. -// Whole package is reused for mobile app via gomobile. -// Therefore only basic types work. +// Todo describes todo item. type Todo struct { - // cannot embed couchdb.Document directly because gomobile complains ID string `json:"_id,omitempty"` Rev string `json:"_rev,omitempty"` Type string `json:"type"` @@ -14,7 +11,6 @@ type Todo struct { } // NewTodo returns new todo item. -// Constructor must exist and must return pointer to work on ios. func NewTodo(text string) *Todo { return &Todo{ Type: "todo", @@ -23,7 +19,7 @@ func NewTodo(text string) *Todo { } } -// let Todo implement couchdb.CouchDoc interface +// implement couchdb.CouchDoc interface // GetID returns document ID. func (t *Todo) GetID() string { diff --git a/main.go b/main.go index 29613ef..bb2ad1c 100644 --- a/main.go +++ b/main.go @@ -14,8 +14,8 @@ import ( ) var ( - indexTemplate = NewAppTemplate("index.html") - loginTemplate = NewAppTemplate("login.html") + indexTemplate = newAppTemplate("index.html") + loginTemplate = newAppTemplate("login.html") ) func init() { @@ -45,11 +45,12 @@ func main() { log.Fatal(http.ListenAndServe(":3000", rWithLogging)) } -func IndexHandler(w http.ResponseWriter, r *http.Request) *appError { +// IndexHandler handles GET request to / +func IndexHandler(w http.ResponseWriter, r *http.Request) *AppError { // check for logged in user - session, err := RediStore.Get(r, "session") + session, err := rediStore.Get(r, "session") if err != nil { - return InternalServerError(fmt.Errorf("get session from redistore: %v", err)) + return internalServerError(fmt.Errorf("get session from redistore: %v", err)) } username := session.Values["username"] if username == nil { @@ -64,12 +65,12 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) *appError { // logged in user susername, ok := username.(string) if !ok { - return InternalServerError(fmt.Errorf("parse %v to string", username)) + return internalServerError(fmt.Errorf("parse %v to string", username)) } // get todos from database todos, err := db.GetTodos(susername) if err != nil { - return InternalServerError(fmt.Errorf("get todos: %v", err)) + return internalServerError(fmt.Errorf("get todos: %v", err)) } data := struct { Username string @@ -81,11 +82,12 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) *appError { return indexTemplate.Execute(w, data) } -func GetLoginHandler(w http.ResponseWriter, r *http.Request) *appError { +// GetLoginHandler handles GET request /login +func GetLoginHandler(w http.ResponseWriter, r *http.Request) *AppError { // check for logged in user - session, err := RediStore.Get(r, "session") + session, err := rediStore.Get(r, "session") if err != nil { - return InternalServerError(fmt.Errorf("get session from redistore: %v", err)) + return internalServerError(fmt.Errorf("get session from redistore: %v", err)) } username := session.Values["username"] if username == nil { @@ -102,17 +104,18 @@ func GetLoginHandler(w http.ResponseWriter, r *http.Request) *appError { return nil } -func PostLoginHandler(w http.ResponseWriter, r *http.Request) *appError { +// PostLoginHandler handles POST request to /login +func PostLoginHandler(w http.ResponseWriter, r *http.Request) *AppError { username := r.FormValue("username") password := r.FormValue("password") if username == "john" && password == "john" { - session, err := RediStore.Get(r, "session") + session, err := rediStore.Get(r, "session") if err != nil { - return InternalServerError(fmt.Errorf("get session from redistore: %v", err)) + return internalServerError(fmt.Errorf("get session from redistore: %v", err)) } session.Values["username"] = username if err := session.Save(r, w); err != nil { - return InternalServerError(fmt.Errorf("save session: %v", err)) + return internalServerError(fmt.Errorf("save session: %v", err)) } http.Redirect(w, r, "/", http.StatusSeeOther) return nil @@ -122,90 +125,95 @@ func PostLoginHandler(w http.ResponseWriter, r *http.Request) *appError { return nil } -func LogoutHandler(w http.ResponseWriter, r *http.Request) *appError { - session, err := RediStore.Get(r, "session") +// LogoutHandler handles GET request to /logout +func LogoutHandler(w http.ResponseWriter, r *http.Request) *AppError { + session, err := rediStore.Get(r, "session") if err != nil { - return InternalServerError(fmt.Errorf("get session from redistore: %v", err)) + return internalServerError(fmt.Errorf("get session from redistore: %v", err)) } session.Options.MaxAge = -1 if err := session.Save(r, w); err != nil { - return InternalServerError(fmt.Errorf("save session: %v", err)) + return internalServerError(fmt.Errorf("save session: %v", err)) } http.Redirect(w, r, "/", http.StatusSeeOther) return nil } -func CreateHandler(w http.ResponseWriter, r *http.Request) *appError { +// CreateHandler handles POST request to /create +func CreateHandler(w http.ResponseWriter, r *http.Request) *AppError { text := r.FormValue("text") todo := item.NewTodo(text) // createdAt has to be set manually here as ios doesn't understand type time yet todo.CreatedAt = float64(time.Now().UTC().Unix()) // get username from session - session, err := RediStore.Get(r, "session") + session, err := rediStore.Get(r, "session") if err != nil { - return InternalServerError(fmt.Errorf("get session from redistore: %v", err)) + return internalServerError(fmt.Errorf("get session from redistore: %v", err)) } username := session.Values["username"].(string) if err := db.SaveTodo(username, todo); err != nil { - return InternalServerError(fmt.Errorf("save todo: %v", err)) + return internalServerError(fmt.Errorf("save todo: %v", err)) } http.Redirect(w, r, "/", http.StatusSeeOther) return nil } -func DeleteHandler(w http.ResponseWriter, r *http.Request) *appError { +// DeleteHandler handles POST request to /{id}/delete +func DeleteHandler(w http.ResponseWriter, r *http.Request) *AppError { vars := mux.Vars(r) id := vars["id"] // get username from session - session, err := RediStore.Get(r, "session") + session, err := rediStore.Get(r, "session") if err != nil { - return InternalServerError(fmt.Errorf("get session from redistore: %v", err)) + return internalServerError(fmt.Errorf("get session from redistore: %v", err)) } username := session.Values["username"].(string) if err := db.DeleteTodoByID(username, id); err != nil { - return InternalServerError(fmt.Errorf("delete todo by id: %v", err)) + return internalServerError(fmt.Errorf("delete todo by id: %v", err)) } http.Redirect(w, r, "/", http.StatusSeeOther) return nil } -func DoneHandler(w http.ResponseWriter, r *http.Request) *appError { +// DoneHandler handles POST request to /{id}/done +func DoneHandler(w http.ResponseWriter, r *http.Request) *AppError { vars := mux.Vars(r) id := vars["id"] // get username from session - session, err := RediStore.Get(r, "session") + session, err := rediStore.Get(r, "session") if err != nil { - return InternalServerError(fmt.Errorf("get session from redistore: %v", err)) + return internalServerError(fmt.Errorf("get session from redistore: %v", err)) } username := session.Values["username"].(string) t, err := db.GetTodoByID(username, id) if err != nil { - return InternalServerError(fmt.Errorf("get todo by id: %v", err)) + return internalServerError(fmt.Errorf("get todo by id: %v", err)) } t.Done = true if err := db.UpdateTodo(username, t); err != nil { - return InternalServerError(fmt.Errorf("update todo: %v", err)) + return internalServerError(fmt.Errorf("update todo: %v", err)) } http.Redirect(w, r, "/", http.StatusSeeOther) return nil } -func UndoneHandler(w http.ResponseWriter, r *http.Request) *appError { +// UndoneHandler handles POST request to /{id}/undone +func UndoneHandler(w http.ResponseWriter, r *http.Request) *AppError { vars := mux.Vars(r) id := vars["id"] // get username from session - session, err := RediStore.Get(r, "session") + session, err := rediStore.Get(r, "session") if err != nil { - return InternalServerError(fmt.Errorf("get session from redistore: %v", err)) + return internalServerError(fmt.Errorf("get session from redistore: %v", err)) } username := session.Values["username"].(string) t, err := db.GetTodoByID(username, id) if err != nil { - return InternalServerError(fmt.Errorf("get todo by id: %v", err)) + return internalServerError(fmt.Errorf("get todo by id: %v", err)) } t.Done = false if err := db.UpdateTodo(username, t); err != nil { - return InternalServerError(fmt.Errorf("update todo: %v", err)) + return internalServerError(fmt.Errorf("update todo: %v", err)) } http.Redirect(w, r, "/", http.StatusSeeOther) return nil diff --git a/template.go b/template.go index 61abf8a..7d23643 100644 --- a/template.go +++ b/template.go @@ -27,24 +27,24 @@ var funcMap = template.FuncMap{ "float64ToHuman": float64ToHuman, } -type AppTemplate struct { +type appTemplate struct { t *template.Template } -func NewAppTemplate(files ...string) *AppTemplate { +func newAppTemplate(files ...string) *appTemplate { base := template.Must(template.New("base").Funcs(funcMap).ParseFiles("base.html")) template.Must(base.ParseFiles(files...)) - return &AppTemplate{base} + return &appTemplate{base} } -func (a AppTemplate) Execute(w http.ResponseWriter, data interface{}) *appError { +func (a appTemplate) Execute(w http.ResponseWriter, data interface{}) *AppError { d := struct { Data interface{} }{ Data: data, } if err := a.t.Execute(w, d); err != nil { - return InternalServerError(fmt.Errorf("execute template: %v", err)) + return internalServerError(fmt.Errorf("execute template: %v", err)) } return nil }