implement /remove, /new, and /replace
This commit is contained in:
146
main.go
Normal file
146
main.go
Normal file
@@ -0,0 +1,146 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
_ "modernc.org/sqlite"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
var (
|
||||
db *sql.DB
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println("hello, world!")
|
||||
var err error
|
||||
db, err = sql.Open("sqlite", "./db/notes.db")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm()
|
||||
if !r.Form.Has("user") {
|
||||
w.WriteHeader(400)
|
||||
fmt.Fprint(w, "This endpoint requires parameters 'user'")
|
||||
return
|
||||
}
|
||||
|
||||
limit, err := strconv.Atoi(r.Form.Get("max"))
|
||||
if err != nil {
|
||||
limit = 100
|
||||
}
|
||||
|
||||
rows := getNotes(r.Form.Get("user"), limit)
|
||||
jsonString, err := json.Marshal(rows)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
w.Header().Add("Content-Type", "text/json")
|
||||
fmt.Fprint(w, string(jsonString))
|
||||
fmt.Println(string(jsonString))
|
||||
})
|
||||
|
||||
http.HandleFunc("/new", func(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm()
|
||||
if !r.Form.Has("user") || !r.Form.Has("data") {
|
||||
w.WriteHeader(400)
|
||||
fmt.Fprint(w, "This endpoint requires parameters 'user' and 'data'")
|
||||
return
|
||||
}
|
||||
|
||||
uuid, err := uuid.NewUUID()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
newNote(r.Form.Get("user"), r.Form.Get("data"), uuid.String())
|
||||
fmt.Fprint(w, uuid)
|
||||
})
|
||||
|
||||
http.HandleFunc("/replace", func(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm()
|
||||
if !r.Form.Has("user") || !r.Form.Has("data") || !r.Form.Has("id") {
|
||||
w.WriteHeader(400)
|
||||
fmt.Fprint(w, "This endpoint requires parameters 'user' and 'data'")
|
||||
return
|
||||
}
|
||||
|
||||
removeNote(r.Form.Get("user"), r.Form.Get("id"))
|
||||
newNote(r.Form.Get("user"), r.Form.Get("data"), r.Form.Get("id"))
|
||||
fmt.Fprint(w, http.StatusText(200))
|
||||
})
|
||||
|
||||
http.HandleFunc("/remove", func(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm()
|
||||
if !r.Form.Has("user") || !r.Form.Has("id") {
|
||||
w.WriteHeader(400)
|
||||
fmt.Fprint(w, "This endpoint requires parameters 'user' and 'id'")
|
||||
return
|
||||
}
|
||||
|
||||
removeNote(r.Form.Get("user"), r.Form.Get("id"))
|
||||
fmt.Fprint(w, http.StatusText(200))
|
||||
})
|
||||
|
||||
log.Fatal(http.ListenAndServe(":3000", nil))
|
||||
}
|
||||
|
||||
func getNotes(user string, limit int) [][2]string {
|
||||
var rowCount int
|
||||
err := db.QueryRow("SELECT COUNT(*) FROM notes WHERE user = ?", user).Scan(&rowCount)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if rowCount > limit {
|
||||
rowCount = limit
|
||||
}
|
||||
|
||||
rows, err := db.Query("SELECT * FROM notes WHERE user = ? LIMIT ?", user, limit)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
notes := make([][2]string, rowCount)
|
||||
var dummy string
|
||||
|
||||
for i := 0; rows.Next(); i++ {
|
||||
var currentRow [2]string
|
||||
if err := rows.Scan(¤tRow[0], &dummy, ¤tRow[1]); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
notes[i] = currentRow
|
||||
}
|
||||
|
||||
return notes
|
||||
}
|
||||
|
||||
func newNote(user string, data string, uuid string) {
|
||||
stmt, err := db.Prepare("INSERT INTO notes VALUES(?, ?, ?)")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if _, err := stmt.Exec(uuid, user, data); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func removeNote(user string, uuid string) {
|
||||
stmt, err := db.Prepare("DELETE FROM notes WHERE user = ? AND id = ?")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if _, err := stmt.Exec(user, uuid); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user