todo

command
v0.0.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 26, 2020 License: MIT Imports: 6 Imported by: 0

README

todo

Ye 'ole todo list example using SQLite.

$ flatend
2020/06/17 01:27:03 Listening for Flatend nodes on '127.0.0.1:9000'.
2020/06/17 01:27:03 Listening for HTTP requests on '[::]:3000'.
2020/06/17 01:27:10 <anon> has connected to you. Services: [all_todos add_todo remove_todo done_todo]

$ go run main.go
2020/06/17 01:27:10 You are now connected to 127.0.0.1:9000. Services: []

$ http://localhost:3000/
addr = "127.0.0.1:9000"

[[http]]
addr = ":3000"

[[http.routes]]
path = "GET /"
static = "./public"

[[http.routes]]
path = "GET /todos"
service = "all_todos"

[[http.routes]]
path = "GET /todos/add/:content"
service = "add_todo"

[[http.routes]]
path = "GET /todos/remove/:id"
service = "remove_todo"

[[http.routes]]
path = "GET /todos/done/:id"
service = "done_todo"
package main

import (
	"database/sql"
	"encoding/json"
	"github.com/lithdew/flatend"
	_ "github.com/mattn/go-sqlite3"
	"os"
	"os/signal"
)

func check(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {
	db, err := sql.Open("sqlite3", ":memory:")
	check(err)

	_, err = db.Exec("CREATE TABLE todo (id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT, state TEXT)")
	check(err)

	node := &flatend.Node{
		Services: map[string]flatend.Handler{
			"all_todos": func(ctx *flatend.Context) {
				rows, err := db.Query("SELECT id, content, state FROM todo")
				if err != nil {
					ctx.Write([]byte(err.Error()))
					return
				}
				defer rows.Close()

				type Todo struct {
					ID int `json:"id"`
					Content string `json:"content"`
					State string `json:'state'`
				}

				todos := make([]Todo, 0)

				for rows.Next() {
					var todo Todo
					if err := rows.Scan(&todo.ID, &todo.Content, &todo.State); err != nil {
						ctx.Write([]byte(err.Error()))
						return
					}
					todos = append(todos, todo)
				}

				buf, err := json.Marshal(todos)
				if err != nil {
					ctx.Write([]byte(err.Error()))
					return
				}

				ctx.WriteHeader("Content-Type", "application/json")
				ctx.Write(buf)
			},
			"add_todo": func(ctx *flatend.Context) {
				content := ctx.Headers["params.content"]

				res, err := db.Exec("INSERT INTO todo (content, state) VALUES (?, '')", content)
				if err != nil {
					ctx.Write([]byte(err.Error()))
					return
				}

				var result struct {
					LastInsertID int64 `json:"lastInsertRowid"`
					RowsAffected int64 `json:"changes"`
				}

				result.LastInsertID, _ = res.LastInsertId()
				result.RowsAffected, _ = res.RowsAffected()

				buf, err := json.Marshal(result)
				if err != nil {
					ctx.Write([]byte(err.Error()))
					return
				}

				ctx.WriteHeader("Content-Type", "application/json")
				ctx.Write(buf)
			},
			"remove_todo": func(ctx *flatend.Context) {
				id := ctx.Headers["params.id"]

				res, err := db.Exec("DELETE FROM todo WHERE id = ?", id)
				if err != nil {
					ctx.Write([]byte(err.Error()))
					return
				}

				var result struct {
					LastInsertID int64 `json:"lastInsertRowid"`
					RowsAffected int64 `json:"changes"`
				}

				result.LastInsertID, _ = res.LastInsertId()
				result.RowsAffected, _ = res.RowsAffected()

				buf, err := json.Marshal(result)
				if err != nil {
					ctx.Write([]byte(err.Error()))
					return
				}

				ctx.WriteHeader("Content-Type", "application/json")
				ctx.Write(buf)
			},
			"done_todo": func(ctx *flatend.Context) {
				id := ctx.Headers["params.id"]

				res, err := db.Exec("UPDATE todo SET state = 'done' WHERE id = ?", id)
				if err != nil {
					ctx.Write([]byte(err.Error()))
					return
				}

				var result struct {
					LastInsertID int64 `json:"lastInsertRowid"`
					RowsAffected int64 `json:"changes"`
				}

				result.LastInsertID, _ = res.LastInsertId()
				result.RowsAffected, _ = res.RowsAffected()

				buf, err := json.Marshal(result)
				if err != nil {
					ctx.Write([]byte(err.Error()))
					return
				}

				ctx.WriteHeader("Content-Type", "application/json")
				ctx.Write(buf)
			},
		},
	}
	check(node.Start("127.0.0.1:9000"))

	ch := make(chan os.Signal, 1)
	signal.Notify(ch, os.Interrupt)
	<-ch

	node.Shutdown()
	check(db.Close())
}

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy