ソースを参照

First stab at domain.

Frederic G. MARAND 5 年 前
コミット
d9e3a92565
6 ファイル変更84 行追加1 行削除
  1. 1 0
      .gitignore
  2. 1 1
      Makefile
  3. 26 0
      domain/short_url.go
  4. 29 0
      domain/short_url_test.go
  5. 20 0
      domain/target_url.go
  6. 7 0
      domain/url.go

+ 1 - 0
.gitignore

@@ -8,6 +8,7 @@
 cmd/kurz/kurz
 cmd/kurzd/kurzd
 doc/*/*.svg
+cover.out
 
 # Folders
 _obj

+ 1 - 1
Makefile

@@ -5,7 +5,7 @@ all: build
 build: cmd/kurz/kurz cmd/kurzd/kurzd
 
 clean:
-	rm -f cmd/kurz/kurz cmd/kurzd/kurzd
+	rm -f cmd/kurz/kurz cmd/kurzd/kurzd cover.out
 
 cmd/kurz/kurz: $(wildcard cmd/kurz/*.go)
 	cd cmd/kurz && go build

+ 26 - 0
domain/short_url.go

@@ -0,0 +1,26 @@
+package domain
+
+import (
+	"errors"
+	"math/rand"
+	"strconv"
+)
+
+type ShortURL struct {
+	URL
+	TargetURL
+}
+
+/*
+MakeShortURL creates a ShortURL instance from a given URL/target pair.
+*/
+func NewUnspecifiedShortURL(targetURL TargetURL) (*ShortURL, error) {
+	if targetURL.IsEmpty() {
+		return nil, errors.New("cannot target empty URL")
+	}
+
+	// FIXME: will cause collisions.
+	url := URL(strconv.Itoa(rand.Intn(1 << 31)))
+	u := ShortURL{url, targetURL}
+	return &u, nil
+}

+ 29 - 0
domain/short_url_test.go

@@ -0,0 +1,29 @@
+package domain
+
+import (
+	"errors"
+	"testing"
+)
+
+func TestNewShortURLHappy(t *testing.T) {
+	tu := TargetURL{"https://example.com"}
+	su, err := NewUnspecifiedShortURL(tu)
+	if err != nil {
+		t.Error(err)
+		t.FailNow()
+	}
+
+	if su.URL.IsEmpty() || su.TargetURL.IsEmpty() || !su.MayRedirect(){
+		t.FailNow()
+	}
+}
+
+func TestNewShortURLSadFromEmpty(t *testing.T) {
+	tu := TargetURL{""}
+	_, err := NewUnspecifiedShortURL(tu)
+	if err == nil {
+		t.Error(errors.New("NewUnspecifiedShortURL should not have created ShortURL from empty target"))
+		t.FailNow()
+	}
+}
+

+ 20 - 0
domain/target_url.go

@@ -0,0 +1,20 @@
+package domain
+
+type TargetURL struct {
+	URL
+}
+
+func (tu *TargetURL) IsEmpty() bool {
+	return tu == nil || tu.URL.IsEmpty()
+}
+
+/*
+MayRedirect defines whether the TargetURL may be used in a redirection.
+
+In the current version, any non empty URL may be used. In future versions, some
+restrictions like blocked URLs or even whole domains may limit the availability
+of a target URL.
+*/
+func (tu *TargetURL) MayRedirect() bool {
+	return !tu.IsEmpty()
+}

+ 7 - 0
domain/url.go

@@ -0,0 +1,7 @@
+package domain
+
+type URL string
+
+func (u URL) IsEmpty() bool {
+	return len(u) == 0
+}