From b3ee5c5e1b326095b4a8591465792b6aa33eab00 Mon Sep 17 00:00:00 2001 From: cdramey Date: Sat, 24 Nov 2018 04:07:39 +0000 Subject: [PATCH] Added proper redirection, improved loading error display --- load.go | 2 +- pages/root.go | 15 ++++++++++++++- storage/bolt/qurl.go | 31 +++++++++++++++++++++++++++++++ storage/storage.go | 1 + 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/load.go b/load.go index 3ad1ddf..f35b204 100644 --- a/load.go +++ b/load.go @@ -61,7 +61,7 @@ func loadjson(stor storage.Storage, filename string) error { err := q.CheckValid() if err != nil { - fmt.Printf("\nValidation failure: %s\n", err.Error()) + fmt.Printf("\n%s\nValidation failure: %s\n", q.URL, err.Error()) continue } diff --git a/pages/root.go b/pages/root.go index aada701..062ad6f 100644 --- a/pages/root.go +++ b/pages/root.go @@ -6,6 +6,7 @@ import ( "net/http" "qurl/static" "qurl/storage" + "qurl/qurl" ) type RootHandler struct { @@ -39,7 +40,19 @@ func (ctx *RootHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx.ServeAPI(w, r) default: - fmt.Printf("Path: %s\n", fname) + id, err := qurl.FromString(fname[1:len(fname)]) + if err != nil { + http.Redirect(w, r, "/", http.StatusTemporaryRedirect) + } + + q, err := ctx.Storage.GetQURLByID(id) + if err != nil { + http.Error(w, fmt.Sprintf("Database error: %s", err.Error()), + http.StatusInternalServerError) + return + } + + http.Redirect(w, r, q.URL, http.StatusPermanentRedirect) } } diff --git a/storage/bolt/qurl.go b/storage/bolt/qurl.go index 08ed84c..fd78c50 100644 --- a/storage/bolt/qurl.go +++ b/storage/bolt/qurl.go @@ -158,3 +158,34 @@ func (stor *BoltStorage) GetQURLByURL(u string) (*qurl.QURL, error) { return q, nil } + +func (stor *BoltStorage) GetQURLByID(id uint64) (*qurl.QURL, error) { + tx, err := stor.DB.Begin(false) + if err != nil { + return nil, err + } + defer tx.Rollback() + + // Create a byte array from the ID + bid := make([]byte, 8) + binary.BigEndian.PutUint64(bid, id) + + rb := tx.Bucket(QURLBucket) + if rb == nil { + return nil, nil + } + + qb := rb.Bucket(bid) + if qb == nil { + return nil, nil + } + + q := &qurl.QURL{ID: id} + + qu := qb.Get(URLField) + if qu != nil { + q.URL = string(qu) + } + + return q, nil +} diff --git a/storage/storage.go b/storage/storage.go index 960af25..157aadf 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -11,6 +11,7 @@ import ( type Storage interface { AddQURL(*qurl.QURL) error GetQURLByURL(string) (*qurl.QURL, error) + GetQURLByID(uint64) (*qurl.QURL, error) SetQURLSequence(uint64) error Backup(string) error Shutdown()