// TODO: READ AND UNDERSTAND package main import ( "context" "encoding/json" "net/http" "strconv" "github.com/go-chi/chi/v5" ) /* // GET /quotes func getQuotes(w http.ResponseWriter, r *http.Request) { rows, err := db.Query(context.Background(), "SELECT * FROM hlaskovnik;") if err != nil { http.Error(w, err.Error(), 500) return } defer rows.Close() var quotes []Quote for rows.Next() { var q Quote rows.Scan(&q.Id, &q.Author, &q.Body) quotes = append(quotes, q) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(quotes) } // POST /quotes func createQuote(w http.ResponseWriter, r *http.Request) { var q Quote err := json.NewDecoder(r.Body).Decode(&q) if err != nil { http.Error(w, "Invalid JSON", 400) return } err = db.QueryRow( context.Background(), "INSERT INTO hlaskovnik(author, body) VALUES($1, $2) RETURNING id;", q.Author, q.Body, ).Scan(&q.Id) if err != nil { http.Error(w, err.Error(), 500) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(q) } // PUT /quotes/{id} func updateQuote(w http.ResponseWriter, r *http.Request) { // get ID from URL idParam := chi.URLParam(r, "id") id, err := strconv.Atoi(idParam) if err != nil { http.Error(w, "Invalid ID", http.StatusBadRequest) return } // parse request body var q Quote err = json.NewDecoder(r.Body).Decode(&q) if err != nil { http.Error(w, "Invalid JSON", http.StatusBadRequest) return } // update DB commandTag, err := db.Exec( context.Background(), `UPDATE hlaskovnik SET author=$1, body=$2 WHERE id=$3`, q.Author, q.Body, id, ) if err != nil { http.Error(w, err.Error(), 500) return } // check if row exists if commandTag.RowsAffected() == 0 { http.Error(w, "Quote not found", http.StatusNotFound) return } // return updated object q.Id = id w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(q) } // DELETE /quotes{id} func deleteQuote(w http.ResponseWriter, r *http.Request) { // get id from URL idParam := chi.URLParam(r, "id") // convert string → int id, err := strconv.Atoi(idParam) if err != nil { http.Error(w, "Invalid ID", http.StatusBadRequest) return } // execute delete commandTag, err := db.Exec( context.Background(), "DELETE FROM hlaskovnik WHERE id=$1", id, ) if err != nil { http.Error(w, err.Error(), 500) return } // check if anything was deleted if commandTag.RowsAffected() == 0 { http.Error(w, "Quote not found", http.StatusNotFound) return } // success response w.WriteHeader(http.StatusNoContent) // 204 } */ // GET /tickets func getTickets(w http.ResponseWriter, r *http.Request) { rows, err := db.Query(context.Background(), "SELECT id, title, description, status, created_at, updated_at FROM tickets ORDER BY id;") if err != nil { http.Error(w, err.Error(), 500) return } defer rows.Close() var tickets []Ticket for rows.Next() { var t Ticket rows.Scan(&t.Id, &t.Title, &t.Description, &t.Status, &t.CreatedAt, &t.UpdatedAt) tickets = append(tickets, t) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(tickets) } // POST /tickets func createTicket(w http.ResponseWriter, r *http.Request) { var t Ticket err := json.NewDecoder(r.Body).Decode(&t) if err != nil { http.Error(w, "Invalid JSON", 400) return } err = db.QueryRow( context.Background(), "INSERT INTO tickets(title, description) VALUES($1, $2) RETURNING id, status, created_at, updated_at;", t.Title, t.Description, ).Scan(&t.Id, &t.Status, &t.CreatedAt, &t.UpdatedAt) if err != nil { http.Error(w, err.Error(), 500) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(t) } // PATCH /tickets/{id} func updateTicket(w http.ResponseWriter, r *http.Request) { // get ID from URL idParam := chi.URLParam(r, "id") id, err := strconv.Atoi(idParam) if err != nil { http.Error(w, "Invalid ID", http.StatusBadRequest) return } // parse request body var status Status err = json.NewDecoder(r.Body).Decode(&status) if err != nil { http.Error(w, "Invalid JSON", http.StatusBadRequest) return } // update DB commandTag, err := db.Exec( context.Background(), `UPDATE tickets SET status=$1 WHERE id=$2`, status.Status, id, ) if err != nil { http.Error(w, err.Error(), 500) return } // check if row exists if commandTag.RowsAffected() == 0 { http.Error(w, "Ticket not found", http.StatusNotFound) return } // fetch the updated row to return it var t Ticket err = db.QueryRow( context.Background(), `SELECT id, title, description, status, created_at, updated_at FROM tickets WHERE id=$1`, id, ).Scan(&t.Id, &t.Title, &t.Description, &t.Status, &t.CreatedAt, &t.UpdatedAt) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // return updated object w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(t) }