From 85566842d07a5a23c07b2a5b6fec24eaf2cbc859 Mon Sep 17 00:00:00 2001 From: Amolith Date: Sat, 5 Feb 2022 00:48:17 -0500 Subject: [PATCH] Check whether name (key) exists before saving --- create.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/create.go b/create.go index e3072ce3d5a58ca3227d3ccb1cbaffe1dced3589..9e67d6dbd96046981724dcac8c7503c2630b419c 100644 --- a/create.go +++ b/create.go @@ -29,7 +29,15 @@ func (m *model) create(writer http.ResponseWriter, request *http.Request) { name := query.Get("name") if len(name) == 0 { - name = uniuri.NewLen(4) + for { + name = uniuri.NewLen(4) + if !m.nameExists(name) { + break + } + } + } else if m.nameExists(name) { + http.Error(writer, "406 Not Acceptable: A shortened URL with this name already exists", 406) + return } log.Println("Saving \"" + url + "\" mapped to \"" + name + "\"") @@ -43,3 +51,17 @@ func (m *model) create(writer http.ResponseWriter, request *http.Request) { http.Error(writer, fmt.Sprint("URL mapped to "+name), 200) } + +func (m model) nameExists(name string) bool { + err := m.database.View(func(txn *badger.Txn) error { + _, err := txn.Get([]byte(name)) + if err != nil { + return err + } + return nil + }) + if err != nil { + return true + } + return false +}