This commit is contained in:
2022-03-19 18:49:41 -07:00
parent 94f996c10d
commit 618ccc23b9
8 changed files with 449 additions and 10 deletions

View File

@@ -2,7 +2,9 @@ package links
import (
"crypto/rand"
"fmt"
"math/big"
"regexp"
)
const codeLength = 5
@@ -10,6 +12,7 @@ const codeLength = 5
var (
alphabet = "ABCDEFGHJKMNPQRSTUVWXYZ23456789"
alphabetLength = big.NewInt(int64(len(alphabet)))
ValidShortCode = regexp.MustCompile(fmt.Sprintf(`^/[%s]{%d}$`, alphabet, codeLength))
)
func randInt() int {

View File

@@ -35,7 +35,7 @@ func connString(user, pass, host, name, port string) string {
func Connect(ctx context.Context) (*pgxpool.Pool, error) {
driver := config.GetDefault(kDriver, defaultDriver)
if driver != defaultDriver {
return nil, errors.F("database: unsupported driver %s", driver)
return nil, fmt.Errorf("database: unsupported driver %s", driver)
}
user := config.GetDefault(kUser, defaultUser)

View File

@@ -2,6 +2,7 @@ package links
import (
"context"
"log"
"net/url"
"time"
@@ -21,16 +22,16 @@ type URL struct {
CreatedAt time.Time
}
func (u *URL) StoreURL(ctx context.Context, db *pgxpool.Pool) error {
func (u *URL) Store(ctx context.Context, db *pgxpool.Pool) error {
stmt := psql.Insert("urls").
Columns("id", "url", "nurl", "short", "created_at").
Values(u.ID, u.URL, u.NURL, u.Short, u.Short, u.CreatedAt)
Values(u.ID, u.URL, u.NURL, u.Short, u.CreatedAt)
query, args, err := stmt.ToSql()
if err != nil {
return err
}
_, err := db.Exec(ctx, query, args...)
_, err = db.Exec(ctx, query, args...)
return err
}
@@ -56,7 +57,7 @@ func NormalizeString(s string) (string, error) {
}
func New(u *url.URL) *URL {
link := URL{
link := &URL{
ID: uuid.NewString(),
URL: u.String(),
NURL: Normalize(u).String(),
@@ -93,9 +94,9 @@ func Lookup(ctx context.Context, db *pgxpool.Pool, s string) (string, error) {
row := db.QueryRow(ctx, query, args...)
var short string
err := row.Scan(&short)
err = row.Scan(&short)
if err != nil {
return nil, err
return "", err
}
return short, nil
@@ -125,5 +126,21 @@ func StoreURL(ctx context.Context, db *pgxpool.Pool, s string) (string, error) {
}
func RetrieveURL(ctx context.Context, db *pgxpool.Pool, short string) (string, error) {
log.Printf("look up url for short code %s", short)
stmt := psql.Select("url").From("urls").
Where(squirrel.Eq{"short": short})
query, args, err := stmt.ToSql()
if err != nil {
return "", err
}
row := db.QueryRow(ctx, query, args...)
var url string
err = row.Scan(&url)
if err != nil {
return "", err
}
return url, nil
}