diff --git a/lib/shrt.go b/lib/shrt.go new file mode 100644 index 0000000..c0f9067 --- /dev/null +++ b/lib/shrt.go @@ -0,0 +1,77 @@ +package shrt + +import ( + //"github.com/asaskevich/govalidator" + "fmt" + "crypto/sha256" + "errors" + "io" + "bytes" +) + +type Storage struct { + Token map[string]string `json: tokens` + Url map[string]shrt `json: urls` +} + +type shrt struct { + URL string + Token string + count int +} + +var ( + ErrNotFound = errors.New("Url not Found") + ErrCreateToken = errors.New("There are some problems while creating Token") +) + +func Open() (*Storage, error){ + // Open db ore create if not exist! + s := Storage{Token: make(map[string]string), Url: make(map[string]shrt)} + return &s, nil +} + +func StreamToByte(stream io.Reader) []byte { + buf := new(bytes.Buffer) + buf.ReadFrom(stream) + return buf.Bytes() +} + +func (s *Storage) Add(URL string) (string, error) { + // if the URL a valid URL? + /*if !govalidator.IsURL(URL) { + return "", errors.New("invalid url") + } */ + + // Create a sha256 Hash from the URL + hash := fmt.Sprintf("%x", sha256.Sum256([]byte(URL))) + + // Test if the URL alraedy exist and return the key + if val, ok := s.Url[hash]; ok { + return val.Token, nil + } + // Iterate to the length of hash to get the shortest output + for hashShortestLen := 1; hashShortestLen <= 32; hashShortestLen++ { + // Test if the Token not exist and return the new generated token + if _, ok := s.Token[hash[:hashShortestLen]]; !ok { + token := hash[:hashShortestLen] + s.Token[token] = hash + s.Url[hash] = shrt{URL: URL, Token: token} + return token, nil + } + } + + return "", ErrCreateToken +} + +func (s *Storage) Remove(URL string) error { + return nil +} + +// Get returns the URL for the given token +func (s *Storage) Get(token string) (string, error) { + if val, ok := s.Token[token]; ok { + return s.Url[val].URL, nil + } + return "", ErrNotFound +} \ No newline at end of file diff --git a/main.go b/main.go new file mode 100644 index 0000000..c465d63 --- /dev/null +++ b/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "net/http" + "fmt" + "log" + "html/template" + "github.com/kreativmonkey/shrt/lib" +) + +type Page struct { + Url string + Token string + Count int +} + +var ( + short *shrt.Storage +) + +func init() { + var err error + short, err = shrt.Open() + if err != nil { + panic(err) + } +} + +func index(w http.ResponseWriter, r *http.Request) { + fmt.Println("method:", r.Method) //get request method + switch r.Method { + case "GET": + t, _ := template.ParseFiles("template/index.gohtml") + t.Execute(w, nil) + case "POST": + r.ParseForm() + token, err := short.Add(ToString(r.Form["url"])) + if err != nil { + panic(err) + } + P := Page{Url: ToString(r.Form["url"]), Token: token} + t, _ := template.ParseFiles("template/index.gohtml") + t.Execute(w, P) + fmt.Println("url:", P) + } + +} + +func handelPost(w http.ResponseWriter, r *http.Request){ + +} + +func main() { + http.HandleFunc("/", index) // setting router rule + err := http.ListenAndServe(":9090", nil) // setting listening port + if err != nil { + log.Fatal("ListenAndServe: ", err) + } +} + +// ToString convert the input to a string. +func ToString(obj interface{}) string { + res := fmt.Sprintf("%s", obj) + return string(res) +} \ No newline at end of file diff --git a/shrt.go b/shrt.go deleted file mode 100644 index c99a333..0000000 --- a/shrt.go +++ /dev/null @@ -1,48 +0,0 @@ -package shrt - -type Storage struct { - Shrt []shrt -} - -type shrt struct{ - URL string - key string - count int -} - -type Site struct { - Host string - db *Bolt.db -} - -func New(URL string) (string, error) { - // if the URL a valid URL? - if !govalidator.IsURL(URL) { - return "", errors.New("invalid url") - } - - // Create a md5 Hash from the URL - hash := fmt.Sprintf("%x", md5.Sum([]byte(url))) - - // Open up the Bold.db - db, err := bolt.Open("my.db", 0600, nil) - if err != nil { - return "", err - } - defer db.Close() - - // check if the URL exist in the DB and return the Key - - - // Iterate to the length of hash to get the shortest output - for hashShortestLen := 1; hashShortestLen <= 32; hashShortestLen++ { - - } - if shortest == "" { - return "", errors.New("url shortening failed") - } - - add := shrt{ URL: URL, key; key count: 0 } - db.Shrt := appand{db.Shrt, add} - return key, nil -} diff --git a/template/index.gohtml b/template/index.gohtml new file mode 100644 index 0000000..d75c505 --- /dev/null +++ b/template/index.gohtml @@ -0,0 +1,16 @@ + + + + + Title + + + +
+ + +
+ +

Current URL: {{.}}

+ + \ No newline at end of file