Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "encoding/csv"
- "encoding/json"
- "fmt"
- "log"
- "net/http"
- "os"
- "slices"
- )
- const fileDb = "ueba.csv"
- type dbLike struct {
- headers []string
- records [][]string
- idIdx int
- idIndex indexById
- }
- type indexById struct {
- index map[string][]string
- }
- func (idx *indexById) getItemById(id string) []string {
- return idx.index[id]
- }
- func newDb() (*dbLike, error) {
- file, err := os.Open(fileDb)
- if err != nil {
- return nil, err
- }
- defer file.Close()
- reader := csv.NewReader(file)
- records, err := reader.ReadAll()
- if err != nil {
- return nil, err
- }
- idIdx := slices.Index(records[0], "id")
- if idIdx == -1 {
- return nil, fmt.Errorf("id field foesn't contain within current csv")
- }
- idIndex := make(map[string][]string)
- for _, record := range records[1:len(records)] {
- dest := idIndex[record[idIdx]]
- dest = record
- idIndex[record[idIdx]] = dest
- }
- return &dbLike{records[0], records[1:len(records)], idIdx, indexById{idIndex}}, nil
- }
- func (db *dbLike) getRecordsContainsId(ids []string) []map[string]string {
- var result []map[string]string
- for i := range ids {
- items := db.idIndex.getItemById(ids[i])
- record := make(map[string]string)
- for i, v := range items {
- record[db.headers[i]] = v
- }
- result = append(result, record)
- }
- return result
- }
- func main() {
- db, err := newDb()
- if err != nil {
- log.Fatal("Error while reading db-like file: ", err)
- }
- http.HandleFunc("/get-items", func(w http.ResponseWriter, r *http.Request) {
- ids, ok := r.URL.Query()["id"]
- if !ok || len(ids) == 0 {
- http.Error(w, "Id parameter should be in query", http.StatusBadRequest)
- return
- }
- items := db.getRecordsContainsId(ids)
- response, err := json.Marshal(items)
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- w.Header().Set("Content-Type", "application/json")
- w.Write(response)
- })
- if err := http.ListenAndServe(":8080", nil); err != nil {
- log.Fatal("Server starting have been failed: ", err)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement