Check whether name (key) exists before saving

Amolith created

Change summary

create.go | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)

Detailed changes

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
+}