Skip to content

Commit 90468c6

Browse files
committed
Added basic admin page
1 parent edf936c commit 90468c6

File tree

8 files changed

+152
-24
lines changed

8 files changed

+152
-24
lines changed

Makefile

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
1-
all:golinks_linux_x86 golinks_linux_x64 golinks_osx_x86 golinks_osx_x64 golinks_windows_x86.exe golinks_windows_x64.exe
1+
all: golinks_linux_x86 golinks_linux_x64 golinks_osx_x86 golinks_osx_x64 golinks_windows_x86.exe golinks_windows_x64.exe
2+
3+
dev: export ADMIN_KEY := test
4+
dev:
5+
go run main.go
26

37
golinks_linux_x86:
4-
GOOS=linux GOARCH=386 go build -o $@
8+
GOOS=linux GOARCH=386 go build -o build/$@
59

610
golinks_osx_x86:
7-
GOOS=darwin GOARCH=386 go build -o $@
11+
GOOS=darwin GOARCH=386 go build -o build/$@
812

913
golinks_windows_x86.exe:
10-
GOOS=windows GOARCH=386 go build -o $@
14+
GOOS=windows GOARCH=386 go build -o build/$@
1115

1216
golinks_linux_x64:
13-
GOOS=linux GOARCH=amd64 go build -o $@
17+
GOOS=linux GOARCH=amd64 go build -o build/$@
1418

1519
golinks_osx_x64:
16-
GOOS=darwin GOARCH=amd64 go build -o $@
20+
GOOS=darwin GOARCH=amd64 go build -o build/$@
1721

1822
golinks_windows_x64.exe:
19-
GOOS=windows GOARCH=amd64 go build -o $@
23+
GOOS=windows GOARCH=amd64 go build -o build/$@
2024

2125

2226
clean:
23-
rm golinks_*
27+
rm -rf build/
2428

2529
.PHONY: golinks_linux_x86 golinks_linux_x64 golinks_osx_x86 golinks_osx_x64 golinks_windows_x86.exe golinks_windows_x64.exe clean

backend/abstract.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package backend
55
*/
66
type AbstractBackend interface {
77
Start()
8+
GetAll() (map[string]string, error)
89
Store(string, string) error
910
Get(string) (string, error)
1011
Delete(string) bool

backend/dict.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,26 @@ func (b *Dict) Get(key string) (string, error) {
4848
defer b.linksLock.RUnlock()
4949
if str, ok := b.links[key]; ok {
5050
return str, nil
51-
} else {
52-
return "", errors.New("No key found.")
5351
}
52+
return "", errors.New("no key found")
53+
}
54+
55+
/**
56+
* GetAll ...
57+
* @return (url, true) if present
58+
* (_, false) if no value present
59+
*/
60+
func (b *Dict) GetAll() (map[string]string, error) {
61+
b.linksLock.RLock()
62+
defer b.linksLock.RUnlock()
63+
return b.links, nil
5464
}
5565

5666
/**
5767
* Delete ...
5868
* @return true if deleted
5969
* false if not present
70+
* FIXME: should return an error also
6071
*/
6172
func (b *Dict) Delete(key string) bool {
6273
b.linksLock.Lock()
@@ -89,7 +100,6 @@ func (b *Dict) MetricGet(key string) uint {
89100
defer b.metricsLock.Unlock()
90101
if val, ok := b.metrics[key]; ok {
91102
return val
92-
} else {
93-
return 0
94103
}
104+
return 0
95105
}

backend/dict_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package backend
2+
3+
import (
4+
"errors"
5+
"strings"
6+
"testing"
7+
)
8+
9+
func TestDictBackendKeyStorage(t *testing.T) {
10+
backend := Dict{}
11+
backend.Start()
12+
13+
if err := backend.Store("key", "val"); err != nil {
14+
t.Errorf("Store(\"key\") got unexpected error: %s", err)
15+
}
16+
17+
if val, err := backend.Get("key"); err != nil {
18+
t.Errorf("Get(\"key\") got unexpected error: %s", err)
19+
} else if val != "val" {
20+
t.Errorf("Get(\"key\") expected:%q actual:%q", "val", val)
21+
}
22+
23+
if val, err := backend.Get("notkey"); err == nil {
24+
t.Errorf("Get(\"notkey\") expected error:%q instead got value:%q", errors.New("no key found"), val)
25+
} else if !strings.Contains(err.Error(), "no key found") {
26+
t.Errorf("Get(\"notkey\") expected error:%q actual:%q", "no key found", err.Error())
27+
}
28+
29+
if err := backend.Store("key", "newval"); err != nil {
30+
t.Errorf("Store(\"key\") unexpected expected error:%s", err)
31+
}
32+
33+
if err := backend.Store("key", "newval"); err != nil {
34+
t.Errorf("Store(\"key\") unexpected expected error:%s", err)
35+
}
36+
37+
if val, err := backend.Get("key"); err != nil {
38+
t.Errorf("Get(\"key\") got unexpected error: %s", err)
39+
} else if val != "newval" {
40+
t.Errorf("Get(\"key\") expected:%q actual:%q", "newval", val)
41+
}
42+
43+
if val := backend.Delete("key"); val != true {
44+
t.Errorf("Delete(\"key\") expected success")
45+
}
46+
47+
if val := backend.Delete("key"); val != false {
48+
t.Errorf("Delete(\"key\") expected failure")
49+
}
50+
51+
if val := backend.Delete("notkey"); val != false {
52+
t.Errorf("Delete(\"key\") expected failure")
53+
}
54+
}

backend/redis.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ func (b *Redis) Get(key string) (string, error) {
4343
return str, err
4444
}
4545

46+
/**
47+
* Get ...
48+
* @return (url, true) if present
49+
* (_, false) if no value present
50+
*/
51+
func (b *Redis) GetAll() (map[string]string, error) {
52+
str, err := b.client.HGetAll("links").Result()
53+
return str, err
54+
}
55+
4656
/**
4757
* Delete ...
4858
* @return true if deleted
@@ -68,7 +78,6 @@ func (b *Redis) MetricIncrement(key string) {
6878
func (b *Redis) MetricGet(key string) uint {
6979
if val, err := b.client.HGet("metrics", key).Uint64(); err == nil {
7080
return uint(val)
71-
} else {
72-
return 0
7381
}
82+
return 0
7483
}

endpoint/admin_dashboard.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,48 @@
11
package endpoint
22

33
import (
4-
"fmt"
54
"net/http"
5+
6+
"github.com/aymerick/raymond"
7+
"github.com/xLegoz/go-links/backend"
68
)
79

10+
//
11+
// var template *raymond.Template
12+
//
13+
// func init() {
14+
// // parse template
15+
// var err error
16+
// template, err = raymond.Parse("templates/admin.html.mustache")
17+
// if err != nil {
18+
// panic(err)
19+
// }
20+
// }
21+
822
/**
923
* AdminDashboardHandler
1024
* @type {String}
1125
*/
1226
func AdminDashboardHandler(w http.ResponseWriter, r *http.Request) {
13-
fmt.Fprintf(w, "Hi there!")
27+
links, err := backend.ActiveBackend.GetAll()
28+
if err != nil {
29+
http.Error(w, err.Error(), http.StatusInternalServerError)
30+
}
31+
32+
ctx := map[string]interface{}{
33+
"links": links,
34+
}
35+
36+
template, err := raymond.ParseFile("templates/admin.html.mustache")
37+
if err != nil {
38+
panic(err)
39+
}
40+
41+
// render template
42+
result, err := template.Exec(ctx)
43+
if err != nil {
44+
http.Error(w, err.Error(), http.StatusInternalServerError)
45+
}
46+
47+
w.Write([]byte(result))
1448
}

main.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ package main
22

33
import (
44
"fmt"
5+
"net/http"
6+
"os"
7+
"strconv"
8+
"strings"
9+
"time"
10+
511
"github.com/go-redis/redis"
612
"github.com/gorilla/mux"
713
log "github.com/sirupsen/logrus"
814
"github.com/xLegoz/go-links/backend"
915
"github.com/xLegoz/go-links/endpoint"
1016
"github.com/xLegoz/go-links/util"
11-
"net/http"
12-
"os"
13-
"strconv"
14-
"strings"
15-
"time"
1617
)
1718

1819
var AdminKey string
@@ -23,7 +24,7 @@ var Store string
2324

2425
func init() {
2526
// set logger level
26-
switch LogLevel = util.Getenv("GOLINK_LOGLEVEL", "info"); LogLevel {
27+
switch LogLevel = util.Getenv("GOLINKS_LOGLEVEL", "info"); LogLevel {
2728
case "debug":
2829
log.SetLevel(log.DebugLevel)
2930
case "info":
@@ -48,10 +49,10 @@ func init() {
4849

4950
// get secret admin key
5051
AdminKey = util.Getenv("ADMIN_KEY", "")
51-
if len(AdminKey) < 16 {
52+
if len(AdminKey) < 4 {
5253
log.WithFields(log.Fields{
5354
"AdminKey": AdminKey,
54-
}).Fatal("Invalid ADMIN_KEY environment variable: needs to be at least 16 characters.")
55+
}).Fatal("Invalid ADMIN_KEY environment variable: needs to be at least 4 characters.")
5556
os.Exit(1)
5657
}
5758

templates/admin.html.mustache

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<html>
2+
<head>
3+
<title>go-links | admin dashboard</title>
4+
</head>
5+
<body>
6+
7+
<ul>
8+
{{#each links}}
9+
<li>
10+
{{@key}}: {{this}}
11+
</li>
12+
{{/each}}
13+
</ul>
14+
</body>
15+
</html>

0 commit comments

Comments
 (0)