First Restful API Version
parent
9d4d1cae6d
commit
8fcb8c3f23
@ -1,154 +1,164 @@
|
||||
package shrt
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"crypto/sha256"
|
||||
"errors"
|
||||
"encoding/json"
|
||||
"net/url"
|
||||
"os"
|
||||
"io"
|
||||
"bytes"
|
||||
"time"
|
||||
"bytes"
|
||||
"crypto/sha256"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/url"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Storage struct {
|
||||
Token map[string]*shrt `json:"token"`
|
||||
Url map[string]string `json:"url"`
|
||||
type Storage struct {
|
||||
Token map[string]*Shrt `json:"token"`
|
||||
Url map[string]string `json:"url"`
|
||||
}
|
||||
|
||||
type shrt struct {
|
||||
URL string `json:"url"`
|
||||
Datum string `json:"datum"`
|
||||
Count int64 `json:"count"`
|
||||
type Shrt struct {
|
||||
URL string `json:"url"`
|
||||
Date string `json:"datum"`
|
||||
Clicks int64 `json:"clicks"`
|
||||
}
|
||||
|
||||
var (
|
||||
ErrNotFound = errors.New("Url not Found")
|
||||
ErrCreateToken = errors.New("There are some problems while creating Token")
|
||||
ErrNoUrl = errors.New("String is no Url!")
|
||||
ErrNotFound = errors.New("Url not Found")
|
||||
ErrCreateToken = errors.New("There are some problems while creating Token")
|
||||
ErrNoUrl = errors.New("String is no Url!")
|
||||
)
|
||||
|
||||
// Open up
|
||||
func Open(path string) (*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(path, os.O_RDWR|os.O_CREATE, 0644); err == nil {
|
||||
json.Unmarshal(StreamToByte(db), &s)
|
||||
db.Close()
|
||||
return &s, nil
|
||||
} else {
|
||||
return &s, err
|
||||
}
|
||||
func Open(path string) (*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(path, 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) Short(URL string, value *string) (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]
|
||||
t := time.Now()
|
||||
s.Token[token] = &shrt{
|
||||
URL: URL,
|
||||
Datum: t.String(),
|
||||
}
|
||||
s.Url[hash] = token
|
||||
*value = s.Url[hash]
|
||||
s.Save()
|
||||
return token, nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", ErrCreateToken
|
||||
func (s *Storage) Short(URL string, value *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 {
|
||||
value = &val
|
||||
return 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]
|
||||
t := time.Now()
|
||||
s.Token[token] = &Shrt{
|
||||
URL: URL,
|
||||
Date: t.String(),
|
||||
}
|
||||
s.Url[hash] = token
|
||||
*value = s.Url[hash]
|
||||
s.Save()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return ErrCreateToken
|
||||
}
|
||||
|
||||
func (s *Storage) Add(URL string, value *string) (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]
|
||||
t := time.Now()
|
||||
s.Token[token] = &shrt{
|
||||
URL: URL,
|
||||
Datum: t.String(),
|
||||
}
|
||||
s.Url[hash] = token
|
||||
*value = s.Url[hash]
|
||||
s.Save()
|
||||
return token, nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", ErrCreateToken
|
||||
// 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]
|
||||
t := time.Now()
|
||||
s.Token[token] = &Shrt{
|
||||
URL: URL,
|
||||
Date: t.String(),
|
||||
}
|
||||
s.Url[hash] = token
|
||||
*value = s.Url[hash]
|
||||
s.Save()
|
||||
return token, nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", ErrCreateToken
|
||||
}
|
||||
|
||||
func (s *Storage) Remove(URL string) error {
|
||||
return nil
|
||||
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].Clicks += 1
|
||||
s.Save()
|
||||
return shrt.URL, true
|
||||
}
|
||||
return "", false
|
||||
}
|
||||
|
||||
// Get returns the URL for the given token
|
||||
func (s *Storage) GetAPI(token string, value *Shrt) 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
|
||||
*value = *shrt
|
||||
return true
|
||||
}
|
||||
return "", false
|
||||
return false
|
||||
}
|
||||
|
||||
// Get all entries
|
||||
func (s *Storage) All() (string) {
|
||||
b, err := json.Marshal(&s)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return string(b)
|
||||
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
|
||||
}
|
||||
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()
|
||||
buf := new(bytes.Buffer)
|
||||
buf.ReadFrom(stream)
|
||||
return buf.Bytes()
|
||||
}
|
||||
|
Loading…
Reference in New Issue