shortify/server.go
2025-08-06 17:38:23 +02:00

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)
}
}