Advertisement
fenixD3

get-items handle with index

Aug 5th, 2024
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.06 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.     idIndex indexById
  20. }
  21.  
  22. type indexById struct {
  23.     index map[string][]string
  24. }
  25.  
  26. func (idx *indexById) getItemById(id string) []string {
  27.     return idx.index[id]
  28. }
  29.  
  30. func newDb() (*dbLike, error) {
  31.     file, err := os.Open(fileDb)
  32.     if err != nil {
  33.         return nil, err
  34.     }
  35.     defer file.Close()
  36.  
  37.     reader := csv.NewReader(file)
  38.     records, err := reader.ReadAll()
  39.     if err != nil {
  40.         return nil, err
  41.     }
  42.  
  43.     idIdx := slices.Index(records[0], "id")
  44.     if idIdx == -1 {
  45.         return nil, fmt.Errorf("id field foesn't contain within current csv")
  46.     }
  47.  
  48.     idIndex := make(map[string][]string)
  49.     for _, record := range records[1:len(records)] {
  50.         dest := idIndex[record[idIdx]]
  51.         dest = record
  52.         idIndex[record[idIdx]] = dest
  53.     }
  54.     return &dbLike{records[0], records[1:len(records)], idIdx, indexById{idIndex}}, nil
  55. }
  56.  
  57. func (db *dbLike) getRecordsContainsId(ids []string) []map[string]string {
  58.     var result []map[string]string
  59.     for i := range ids {
  60.         items := db.idIndex.getItemById(ids[i])
  61.         record := make(map[string]string)
  62.         for i, v := range items {
  63.             record[db.headers[i]] = v
  64.         }
  65.         result = append(result, record)
  66.     }
  67.     return result
  68. }
  69.  
  70. func main() {
  71.     db, err := newDb()
  72.     if err != nil {
  73.         log.Fatal("Error while reading db-like file: ", err)
  74.     }
  75.  
  76.     http.HandleFunc("/get-items", func(w http.ResponseWriter, r *http.Request) {
  77.         ids, ok := r.URL.Query()["id"]
  78.         if !ok || len(ids) == 0 {
  79.             http.Error(w, "Id parameter should be in query", http.StatusBadRequest)
  80.             return
  81.         }
  82.  
  83.         items := db.getRecordsContainsId(ids)
  84.  
  85.         response, err := json.Marshal(items)
  86.         if err != nil {
  87.             http.Error(w, err.Error(), http.StatusInternalServerError)
  88.             return
  89.         }
  90.  
  91.         w.Header().Set("Content-Type", "application/json")
  92.         w.Write(response)
  93.     })
  94.     if err := http.ListenAndServe(":8080", nil); err != nil {
  95.         log.Fatal("Server starting have been failed: ", err)
  96.     }
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement