Advertisement
Guest User

Connection Refused

a guest
Feb 29th, 2024
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.83 KB | Source Code | 0 0
  1. package main
  2.  
  3. import (
  4.     "database/sql"
  5.     "encoding/json"
  6.     "errors"
  7.     "fmt"
  8.     "io"
  9.     "log"
  10.     "net/http"
  11.     "os"
  12.     "time"
  13.     "github.com/gorilla/mux"
  14.     _ "github.com/lib/pq"
  15. )
  16.  
  17. type AppLog struct {
  18.     AppId       string `json:"appId"`
  19.     LogTitle    string `json:"logTitle"`
  20.     AppTitle    string `json:"appTitle"`
  21.     LogContent  string `json:"logContent"`
  22.     LogDateTime string `json:"logDateTime"`
  23. }
  24.  
  25. func main() {
  26.     db, dbErr := sql.Open("postgres", os.Getenv("DATABASE_URL"))
  27.     if dbErr != nil {
  28.         fmt.Println("Database error: ", dbErr);
  29.         log.Fatal(dbErr);
  30.     }
  31.  
  32.     defer db.Close()
  33.  
  34.     _, createErr := db.Exec("CREATE TABLE IF NOT EXISTS logs (id SERIAL PRIMARY KEY, appId TEXT NOT NULL, logTitle TEXT NOT NULL, appTitle TEXT, logContent TEXT, logDateTime TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW())")
  35.     if createErr != nil {
  36.         log.Fatal(createErr)
  37.     }
  38.  
  39.     router := mux.NewRouter().StrictSlash(true)
  40.     router.HandleFunc("/", getRoot)
  41.     router.HandleFunc("/logs", getAllAppLogs(db)).Methods("GET")
  42.     router.HandleFunc("/logs", postAppLogs(db)).Methods("POST")
  43.  
  44.     err := http.ListenAndServe(":8000", jsonContentTypeMiddleware(router))
  45.  
  46.     if errors.Is(err, http.ErrServerClosed) {
  47.         fmt.Println("Server is closed.")
  48.     } else if err != nil {
  49.         fmt.Println("Error starting Server.")
  50.     }
  51. }
  52.  
  53. func jsonContentTypeMiddleware(next http.Handler) http.Handler {
  54.     return http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
  55.         w.Header().Set("Content-Type", "application/json")
  56.         next.ServeHTTP(w, r)
  57.     })
  58. }
  59.  
  60. func getRoot(w http.ResponseWriter, r *http.Request) {
  61.     fmt.Println("Received / request.")
  62.     io.WriteString(w, "This server is an attempt to make and App Log producer and consumer.\n")
  63. }
  64.  
  65. func getAllAppLogs(db *sql.DB) http.HandlerFunc {
  66.     fmt.Println("Received /logs GET request.")
  67.     return func (w http.ResponseWriter, r *http.Request) {
  68.         rows, err := db.Query("SELECT * FROM logs")
  69.         if err != nil {
  70.             log.Fatal(err)
  71.         }
  72.         defer rows.Close()
  73.  
  74.         logs := []AppLog{}
  75.         for rows.Next() {
  76.             var alg AppLog
  77.             if err := rows.Scan(&alg.AppId, &alg.LogTitle, &alg.AppTitle, &alg.LogContent, &alg.LogDateTime); err != nil {
  78.                 log.Fatal(err)
  79.             }
  80.         }
  81.  
  82.         if err := rows.Err(); err != nil {
  83.             log.Fatal(err)
  84.         }
  85.  
  86.         json.NewEncoder(w).Encode(logs)
  87.     }
  88. }
  89.  
  90. func postAppLogs(db *sql.DB) http.HandlerFunc {
  91.     return func (w http.ResponseWriter, r *http.Request) {
  92.         fmt.Println("Received /logs POST request. Body:", r.Body)
  93.         var alg AppLog
  94.         currentTime := time.Now()
  95.         json.NewDecoder(r.Body).Decode(&alg)
  96.         err := db.QueryRow(
  97.             "INSERT INTO logs (appId, logTitle, appTitle, logContent, logDateTime) VALUES ($1, $2, $3, $4, $5) RETURNING id",
  98.             alg.AppId,
  99.             alg.LogTitle,
  100.             alg.AppTitle,
  101.             alg.LogContent,
  102.             currentTime,
  103.         ).Scan()
  104.  
  105.         if err != nil {
  106.             log.Fatal(err)
  107.         }
  108.         json.NewEncoder(w).Encode(alg)
  109.     }
  110. }
  111.  
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement