Skip to content

Commit

Permalink
meta lint
Browse files Browse the repository at this point in the history
  • Loading branch information
zemirco committed Jan 24, 2016
1 parent 9c93a0f commit 224bbd7
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 63 deletions.
9 changes: 4 additions & 5 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand All @@ -28,7 +27,7 @@ func init() {
panic(err)
}
log.Println(client.Info())
db = Database{
db = database{
Client: client,
}
}
14 changes: 7 additions & 7 deletions database.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/zemirco/todo/item"
)

type Database struct {
type database struct {
Client *couchdb.Client
}

Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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{
Expand All @@ -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 {
Expand All @@ -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)
Expand Down
9 changes: 5 additions & 4 deletions error.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
8 changes: 2 additions & 6 deletions item/item.go
Original file line number Diff line number Diff line change
@@ -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"`
Expand All @@ -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",
Expand All @@ -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 {
Expand Down
80 changes: 44 additions & 36 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import (
)

var (
indexTemplate = NewAppTemplate("index.html")
loginTemplate = NewAppTemplate("login.html")
indexTemplate = newAppTemplate("index.html")
loginTemplate = newAppTemplate("login.html")
)

func init() {
Expand Down Expand Up @@ -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 {
Expand All @@ -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
Expand All @@ -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 {
Expand All @@ -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
Expand All @@ -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
Expand Down
10 changes: 5 additions & 5 deletions template.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit 224bbd7

Please sign in to comment.