76 lines
1.4 KiB
Go
76 lines
1.4 KiB
Go
package shortify
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
var ErrNotFound = errors.New("short URL not found")
|
|
|
|
// GetURL first checks cache, then DB, and updates cache on hit
|
|
func (s *Server) GetURL(id string) (string, error) {
|
|
s.cacheLock.RLock()
|
|
if val, ok := s.cache.Get(id); ok {
|
|
s.cacheLock.RUnlock()
|
|
return val.(string), nil
|
|
}
|
|
s.cacheLock.RUnlock()
|
|
|
|
url, err := s.storage.Get(id)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
s.cacheLock.Lock()
|
|
s.cache.Add(id, url)
|
|
s.cacheLock.Unlock()
|
|
|
|
return url, nil
|
|
}
|
|
|
|
/* Simple routes to use for fiber below! */
|
|
|
|
func (s *Server) HandleGetURL() func(*fiber.Ctx) error {
|
|
return func(c *fiber.Ctx) error {
|
|
shortID := c.Params("id")
|
|
|
|
url, err := s.GetURL(shortID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
s.LogVisit(VisitLog{
|
|
ShortID: shortID,
|
|
LongURL: url,
|
|
|
|
IP: c.IP(),
|
|
|
|
UserAgent: string(c.Context().UserAgent()),
|
|
Language: c.GetReqHeaders()["Accept-Language"][0],
|
|
Referer: string(c.Request().Header.Referer()),
|
|
|
|
Time: time.Now(),
|
|
})
|
|
|
|
c.Set("Referrer-Policy", "no-referrer")
|
|
return c.Redirect(url, fiber.StatusFound)
|
|
}
|
|
}
|
|
|
|
func (s *Server) HandlePostURL() func(*fiber.Ctx) error {
|
|
return func(c *fiber.Ctx) error {
|
|
|
|
targetUrl := string(c.Body())
|
|
|
|
newId := s.serverGen.NextID()
|
|
|
|
if err := s.storage.Put(newId, targetUrl); err != nil {
|
|
return err
|
|
}
|
|
|
|
return c.SendString(newId)
|
|
}
|
|
}
|