Advertisement
fenixD3

get-items handle

Aug 3rd, 2024
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.85 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "encoding/csv"
  5.     "encoding/json"
  6.     "fmt"
  7.     "log"
  8.     "net/http"
  9.     "os"
  10.     "slices"
  11. )
  12.  
  13. const fileDb = "ueba.csv"
  14.  
  15. type dbLike struct {
  16.     headers []string
  17.     records [][]string
  18.     idIdx   int
  19. }
  20.  
  21. func newDb() (*dbLike, error) {
  22.     file, err := os.Open(fileDb)
  23.     if err != nil {
  24.         return nil, err
  25.     }
  26.     defer file.Close()
  27.  
  28.     reader := csv.NewReader(file)
  29.     records, err := reader.ReadAll()
  30.     if err != nil {
  31.         return nil, err
  32.     }
  33.  
  34.     idIdx := slices.Index(records[0], "id")
  35.     if idIdx == -1 {
  36.         return nil, fmt.Errorf("id field foesn't contain within current csv")
  37.     }
  38.     return &dbLike{records[0], records[1:len(records)], idIdx}, nil
  39. }
  40.  
  41. func (db *dbLike) getRecordsContainsId(ids []string) ([]map[string]string, error) {
  42.     var result []map[string]string
  43.     for _, row := range db.records {
  44.         if !slices.Contains(ids, row[db.idIdx]) {
  45.             continue
  46.         }
  47.  
  48.         record := make(map[string]string)
  49.         for i, v := range row {
  50.             record[db.headers[i]] = v
  51.         }
  52.         result = append(result, record)
  53.     }
  54.     return result, nil
  55. }
  56.  
  57. func main() {
  58.     db, err := newDb()
  59.     if err != nil {
  60.         log.Fatal("Error while reading db-like file: ", err)
  61.     }
  62.  
  63.     http.HandleFunc("/get-items", func(w http.ResponseWriter, r *http.Request) {
  64.         ids, ok := r.URL.Query()["id"]
  65.         if !ok || len(ids) == 0 {
  66.             http.Error(w, "Id parameter should be in query", http.StatusBadRequest)
  67.             return
  68.         }
  69.  
  70.         items, err := db.getRecordsContainsId(ids)
  71.         if err != nil {
  72.             http.Error(w, err.Error(), http.StatusInternalServerError)
  73.             return
  74.         }
  75.  
  76.         response, err := json.Marshal(items)
  77.         if err != nil {
  78.             http.Error(w, err.Error(), http.StatusInternalServerError)
  79.             return
  80.         }
  81.  
  82.         w.Header().Set("Content-Type", "application/json")
  83.         w.Write(response)
  84.     })
  85.     if err := http.ListenAndServe(":8080", nil); err != nil {
  86.         log.Fatal("Server starting have been failed: ", err)
  87.     }
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement