Skip to content

Instantly share code, notes, and snippets.

@bestform
Created January 15, 2016 22:20
Show Gist options
  • Save bestform/5bf30df7db886f42dd95 to your computer and use it in GitHub Desktop.
Save bestform/5bf30df7db886f42dd95 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/json"
"io/ioutil"
"net/http"
"os"
)
type SaveResponse struct {
Status, Msg string
}
type Entry struct {
Title, Url string
}
type EntryList struct {
Entries map[string](Entry)
}
type ListStorageReader interface {
Read() EntryList
}
type ListStorageWriter interface {
Write(e Entry)
}
type ListStorageDeleter interface {
DeleteEntry(title string)
}
type FileStorage struct {
FileName string
}
func (f FileStorage) Read() EntryList {
data, err := ioutil.ReadFile(f.FileName)
if err != nil {
emptyMap := make(map[string]Entry)
return EntryList{emptyMap}
}
var entryList EntryList
json.Unmarshal(data, &entryList)
return entryList
}
func (f FileStorage) Write(e Entry) {
existing := f.Read()
existing.Entries[e.Title] = e
data, _ := json.Marshal(existing)
ioutil.WriteFile(f.FileName, data, os.ModePerm)
}
func (f FileStorage) DeleteEntry(title string) {
existing := f.Read()
if _, ok := existing.Entries[title]; ok == true {
delete(existing.Entries, title)
data, _ := json.Marshal(existing)
ioutil.WriteFile(f.FileName, data, os.ModePerm)
}
}
var storage = FileStorage{FileName: "data.json"}
func main() {
http.HandleFunc("/save", save)
http.HandleFunc("/list", list)
http.HandleFunc("/delete", deleteEntry)
http.ListenAndServe(":8080", nil)
}
func deleteEntry(w http.ResponseWriter, req *http.Request) {
title := req.FormValue("title")
if "" == title {
w.Write(getFormattedSaveResponse("1", "No title given"))
return
}
storage.DeleteEntry(title)
w.Write(getFormattedSaveResponse("0", "Entry deleted"))
}
func list(w http.ResponseWriter, req *http.Request) {
resp := storage.Read()
jsonResp, _ := json.MarshalIndent(resp, "", " ")
w.Write([]byte(jsonResp))
}
func save(w http.ResponseWriter, req *http.Request) {
title := req.FormValue("title")
if "" == title {
w.Write(getFormattedSaveResponse("1", "No title given"))
return
}
url := req.FormValue("url")
if "" == url {
w.Write(getFormattedSaveResponse("1", "No url given"))
return
}
storage.Write(Entry{Title: title, Url: url})
w.Write(getFormattedSaveResponse("0", "Link Saved"))
}
func getFormattedSaveResponse(status, msg string) []byte {
resp, _ := json.MarshalIndent(SaveResponse{Status: status, Msg: msg}, "", " ")
return []byte(resp)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment