package handlers import ( "encoding/json" "fmt" "maot-shortner/internal/database" "maot-shortner/internal/services" "net/http" ) type Response struct { Message string `json:"message"` } type LinkHandler struct { db *database.Database linkService *services.LinkService } func (h *LinkHandler) Handle(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(&Response{Message: "Ola"}) } func NewLinkHandler(db *database.Database) *LinkHandler { return &LinkHandler{ db: db, linkService: services.NewLinkService(db), } } func (h *LinkHandler) ListLinks(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) linkList, err := h.linkService.GetLinks(r.Context()) if err != nil { http.Error(w, fmt.Sprintf("Failed to list links: %v", err), http.StatusInternalServerError) return } json.NewEncoder(w).Encode(linkList) } func (h *LinkHandler) CreateLink(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) var linkRequest struct { URL string `json:"url"` RedirectCode *string `json:"redirect_code,omitempty"` } if err := json.NewDecoder(r.Body).Decode(&linkRequest); err != nil { http.Error(w, fmt.Sprintf("Failed to decode request body: %v", err), http.StatusBadRequest) return } link, err := h.linkService.CreateLink(r.Context(), linkRequest.URL, linkRequest.RedirectCode) if err != nil { http.Error(w, fmt.Sprintf("Failed to create link: %v", err), http.StatusInternalServerError) return } json.NewEncoder(w).Encode(link) } func (h *LinkHandler) GetUrl(w http.ResponseWriter, r *http.Request) { currentCode := r.PathValue("id") link, err := h.linkService.GetLink(r.Context(), currentCode) if err != nil { http.Error(w, fmt.Sprintf("Failed to get link: %v", err), http.StatusInternalServerError) return } http.Redirect(w, r, link.LongURL, http.StatusFound) }