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