mirror of
https://github.com/jimeh/ozu.io.git
synced 2026-02-19 08:06:39 +00:00
69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
package shortener
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/jimeh/go-base58"
|
|
"github.com/jimeh/ozu.io/storage"
|
|
)
|
|
|
|
var urlKeyPrefix = []byte("url:")
|
|
var uidKeyPrefix = []byte("uid:")
|
|
var errInvalidUID = errors.New("invalid UID")
|
|
|
|
// NewBase58 returns a new *Base58Shortner that uses the given storage.Store.
|
|
func NewBase58(store storage.Store) *Base58Shortener {
|
|
return &Base58Shortener{Store: store}
|
|
}
|
|
|
|
// Base58Shortener shortens URLs via base 58 encoding.
|
|
type Base58Shortener struct {
|
|
Store storage.Store
|
|
}
|
|
|
|
// Shorten a given URL.
|
|
func (s *Base58Shortener) Shorten(rawURL []byte) (*storage.Record, error) {
|
|
url, err := NormalizeURL(rawURL)
|
|
if err != nil {
|
|
return &storage.Record{}, err
|
|
}
|
|
|
|
record, err := s.Store.FindByURL(url)
|
|
if err == nil {
|
|
return record, nil
|
|
} else if err != storage.ErrNotFound {
|
|
return &storage.Record{}, err
|
|
}
|
|
|
|
uid, err := s.newUID()
|
|
if err != nil {
|
|
return &storage.Record{}, err
|
|
}
|
|
|
|
record, err = s.Store.Create(uid, url)
|
|
if err != nil {
|
|
return &storage.Record{}, err
|
|
}
|
|
|
|
return record, nil
|
|
}
|
|
|
|
// Lookup the URL of a given UID.
|
|
func (s *Base58Shortener) Lookup(uid []byte) (*storage.Record, error) {
|
|
_, err := base58.Decode(uid)
|
|
if err != nil {
|
|
return &storage.Record{}, errInvalidUID
|
|
}
|
|
|
|
return s.Store.FindByUID(uid)
|
|
}
|
|
|
|
func (s *Base58Shortener) newUID() ([]byte, error) {
|
|
index, err := s.Store.NextSequence()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return base58.Encode(index), nil
|
|
}
|