parent
6c4196cb91
commit
315dd5e62f
@ -1,81 +0,0 @@ |
||||
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, value interface{}) (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} |
||||
value = s.Url[hash] |
||||
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, value interface{}) bool { |
||||
if hash, ok := s.Token[token]; ok { |
||||
fmt.Printf("Url gefunden %s mit Hash: %v \n", s.Url[hash].URL, hash) |
||||
value = s.Url[hash].URL |
||||
fmt.Printf("Value: %V \n", value) |
||||
return true |
||||
} |
||||
return false |
||||
} |
@ -0,0 +1,112 @@ |
||||
package shrt |
||||
|
||||
import ( |
||||
"fmt" |
||||
"crypto/sha256" |
||||
"errors" |
||||
"encoding/json" |
||||
"net/url" |
||||
"os" |
||||
"io" |
||||
"bytes" |
||||
) |
||||
|
||||
type Storage struct { |
||||
Token map[string]*shrt |
||||
Url map[string]string |
||||
} |
||||
|
||||
type shrt struct { |
||||
URL string |
||||
Datum string |
||||
Count int64 |
||||
} |
||||
|
||||
var ( |
||||
ErrNotFound = errors.New("Url not Found") |
||||
ErrCreateToken = errors.New("There are some problems while creating Token") |
||||
ErrNoUrl = errors.New("String is no Url!") |
||||
) |
||||
|
||||
func Open() (*Storage, error){ |
||||
s := Storage{Token: make(map[string]*shrt), Url: make(map[string]string)} |
||||
// Open db ore create if not exist!
|
||||
if db, err := os.OpenFile("./test.db", os.O_RDWR|os.O_CREATE, 0644); err == nil { |
||||
json.Unmarshal(StreamToByte(db), &s) |
||||
db.Close() |
||||
return &s, nil |
||||
} else { |
||||
return &s, err |
||||
} |
||||
} |
||||
|
||||
func (s *Storage) Add(URL string, value interface{}) (string, error) { |
||||
// Check if it is a valide Url found on:
|
||||
// http://stackoverflow.com/questions/31480710/validate-url-with-standard-package-in-go
|
||||
_, err := url.ParseRequestURI(URL) |
||||
if err != nil { |
||||
return "", ErrNoUrl |
||||
} |
||||
|
||||
// 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, 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] = &shrt{URL: URL} |
||||
s.Url[hash] = token |
||||
value = s.Url[hash] |
||||
s.Save() |
||||
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, bool) { |
||||
if shrt, ok := s.Token[token]; ok { |
||||
fmt.Printf("Url mit dem Token %s gefunden: %s \n", token, shrt.URL) |
||||
s.Token[token].Count += 1 |
||||
s.Save() |
||||
return shrt.URL, true |
||||
} |
||||
return "", false |
||||
} |
||||
|
||||
func (s *Storage) All() (string) { |
||||
b, err := json.Marshal(&s) |
||||
if err != nil { |
||||
return "" |
||||
} |
||||
return string(b) |
||||
} |
||||
|
||||
func (s *Storage) Save() error { |
||||
if db, err := os.OpenFile("./test.db", os.O_RDWR|os.O_CREATE, 0644); err == nil { |
||||
b, err := json.Marshal(&s) |
||||
db.Write(b) |
||||
db.Close() |
||||
return err |
||||
} else { |
||||
return err |
||||
} |
||||
} |
||||
|
||||
func StreamToByte(stream io.Reader) []byte { |
||||
buf := new(bytes.Buffer) |
||||
buf.ReadFrom(stream) |
||||
return buf.Bytes() |
||||
} |
Loading…
Reference in new issue