From 43673d5573b0326c0cb3b5e8b081f200b9eca6a4 Mon Sep 17 00:00:00 2001
From: Cornelius Rautenbach <cornel.rautenbach@gmail.com>
Date: Fri, 17 Sep 2021 09:59:51 +0200
Subject: [PATCH] Address utils

---
 address_utils/address_utils.go | 74 ++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)
 create mode 100644 address_utils/address_utils.go

diff --git a/address_utils/address_utils.go b/address_utils/address_utils.go
new file mode 100644
index 0000000..f955fed
--- /dev/null
+++ b/address_utils/address_utils.go
@@ -0,0 +1,74 @@
+package address_utils
+
+import (
+	"crypto/md5"
+	"fmt"
+	"gitlab.com/uafrica/go-utils/string_utils"
+	"regexp"
+	"strings"
+)
+
+// MD5HashOfAddress calculates and returns the MD5 hash of the entered address, lat and lng concatenated together. If lat and lng is blank, it is only the hash of the entered address
+func MD5HashOfAddress(enteredAddress string, lat *float64, lng *float64) string {
+	valueToHash := enteredAddress
+	if lat != nil && lng != nil {
+		valueToHash += fmt.Sprintf(",%v,%v", *lat, *lng)
+	}
+
+	return fmt.Sprintf("%X", md5.Sum([]byte(valueToHash)))
+}
+
+// MD5HashOfLowerCaseEnteredAddress calculates and returns the MD5 hash of a string after preparing the string properly.
+func MD5HashOfLowerCaseEnteredAddress(enteredAddress string) string {
+	valueToHash := cleanLowerCaseAddress(enteredAddress)
+	return fmt.Sprintf("%X", md5.Sum([]byte(valueToHash)))
+}
+
+func cleanLowerCaseAddress(enteredAddress string) string {
+	// Lowercase.
+	enteredAddress = strings.ToLower(enteredAddress)
+
+	// Remove unwanted characters.
+	enteredAddress = stripUnwantedCharacters(enteredAddress)
+
+	// Remove ave, str, etc.
+	enteredAddress = stripStreetTerms(enteredAddress)
+
+	// Remove all whitespace.
+	enteredAddress = string_utils.RemoveAllWhiteSpaces(enteredAddress)
+
+	return enteredAddress
+}
+
+func stripStreetTerms(s string) string {
+	terms := []string{
+		"ave",
+		"avenue",
+		"str",
+		"street",
+		"st",
+		"straat",
+		"lane",
+		"ln",
+		"laan",
+		"road",
+		"rd",
+		"boulevard",
+		"blvd",
+		"drive",
+		"drv",
+		"way",
+		"weg",
+	}
+	re := regexp.MustCompile(`\s+(` + strings.Join(terms, "|") + `)[\s]*`)
+	s = re.ReplaceAllString(s, "")
+
+	return s
+}
+
+func stripUnwantedCharacters(s string) string {
+	re := regexp.MustCompile(`[^\s\w,-]`)
+	s = re.ReplaceAllString(s, "")
+
+	return s
+}
-- 
GitLab