From b8e853b54f98e178e762356f4034d67e64fb86d5 Mon Sep 17 00:00:00 2001 From: Richard Melkonian Date: Thu, 8 Sep 2022 13:01:12 +0100 Subject: [PATCH 1/4] created routes controller and model func, created migration --- backend/main/models/community.go | 21 +++++++++++++++++-- backend/main/server/controllers.go | 14 +++++++++++-- backend/main/server/helpers.go | 9 ++++++++ backend/main/server/routes.go | 5 ++++- .../000039_add_tigram_extension.down.sql | 1 + .../000039_add_tigram_extension.up.sql | 1 + 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 backend/migrations/000039_add_tigram_extension.down.sql create mode 100644 backend/migrations/000039_add_tigram_extension.up.sql diff --git a/backend/main/models/community.go b/backend/main/models/community.go index 6f4a43070..a116b4693 100644 --- a/backend/main/models/community.go +++ b/backend/main/models/community.go @@ -249,8 +249,7 @@ func (c *Community) CreateCommunity(db *s.Database) error { func (c *Community) UpdateCommunity(db *s.Database, p *UpdateCommunityRequestPayload) error { _, err := db.Conn.Exec( db.Context, - ` - UPDATE communities + `UPDATE communities SET name = COALESCE($1, name), body = COALESCE($2, body), logo = COALESCE($3, logo), @@ -308,6 +307,24 @@ func (c *Community) CanUpdateCommunity(db *s.Database, addr string) error { return nil } +func SearchForCommunity(db *s.Database, query string) ([]Community, error) { + var results []Community + + rows, err := db.Conn.Query( + db.Context, + `SELECT DISTINCT(event_type) FROM storm_events WHERE DIFFERENCE(event_type, 'test') > 2`, + query, + ) + if err != nil { + return results, fmt.Errorf("error searching for a community with the the param %s", query) + } + + if err := rows.Scan(results); err != nil { + return []Community{}, fmt.Errorf("could not scan the query results into the community struct, type mismatch") + } + return results, nil +} + func MatchStrategyByProposal(s []Strategy, strategyToMatch string) (Strategy, error) { var match Strategy for _, strategy := range s { diff --git a/backend/main/server/controllers.go b/backend/main/server/controllers.go index f8c885e14..9f37ef7de 100644 --- a/backend/main/server/controllers.go +++ b/backend/main/server/controllers.go @@ -283,7 +283,6 @@ func (a *App) updateProposal(w http.ResponseWriter, r *http.Request) { } // Communities - func (a *App) getCommunities(w http.ResponseWriter, r *http.Request) { pageParams := getPageParams(*r, 25) @@ -299,10 +298,21 @@ func (a *App) getCommunities(w http.ResponseWriter, r *http.Request) { respondWithJSON(w, http.StatusOK, response) } +func (a *App) searchCommunities(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + results, err := helpers.searchCommuntities(vars["query"]) + if err != nil { + respondWithError(w, http.StatusInternalServerError, err.Error()) + } + + fmt.Printf("results: %v \n", results) + + respondWithJSON(w, http.StatusOK, results) +} + func (a *App) getCommunity(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) - if err != nil { respondWithError(w, http.StatusBadRequest, "Invalid Community ID.") return diff --git a/backend/main/server/helpers.go b/backend/main/server/helpers.go index fdf1d889d..e79bf1dda 100644 --- a/backend/main/server/helpers.go +++ b/backend/main/server/helpers.go @@ -441,6 +441,15 @@ func (h *Helpers) fetchCommunity(id int) (models.Community, int, error) { return community, http.StatusOK, nil } +func (h *Helpers) searchCommuntities(query string) ([]models.Community, error) { + results, err := models.SearchForCommunity(h.A.DB, query) + if err != nil { + return []models.Community{}, err + } + + return results, nil +} + func (h *Helpers) createProposal(p models.Proposal) (models.Proposal, int, error) { if p.Voucher != nil { if err := h.validateUserViaVoucher(p.Creator_addr, p.Voucher); err != nil { diff --git a/backend/main/server/routes.go b/backend/main/server/routes.go index c9d35b0ed..16ff410aa 100644 --- a/backend/main/server/routes.go +++ b/backend/main/server/routes.go @@ -13,6 +13,8 @@ func (a *App) initializeRoutes() { a.Router.HandleFunc("/communities/{id:[0-9]+}", a.updateCommunity).Methods("PATCH", "OPTIONS") a.Router.HandleFunc("/communities", a.createCommunity).Methods("POST", "OPTIONS") a.Router.HandleFunc("/communities/{communityId:[0-9]+}/strategies", a.getActiveStrategiesForCommunity).Methods("GET") + //Community Search + a.Router.HandleFunc("/communities/search/{query:[a-zA-Z0-9]+}", a.searchCommunities).Methods("GET") // Proposals a.Router.HandleFunc("/proposals/{id:[0-9]+}", a.getProposal).Methods("GET") a.Router.HandleFunc("/proposals/{id:[0-9]+}", a.updateProposal).Methods("PUT", "OPTIONS") @@ -54,5 +56,6 @@ func (a *App) initializeRoutes() { // Snapshotter a.Router.HandleFunc("/latest-snapshot", a.getLatestSnapshot).Methods("GET") - a.Router.HandleFunc("/add-fungible-token", a.addFungibleToken).Methods("POST","OPTIONS") + a.Router.HandleFunc("/add-fungible-token", a.addFungibleToken).Methods("POST", "OPTIONS") + } diff --git a/backend/migrations/000039_add_tigram_extension.down.sql b/backend/migrations/000039_add_tigram_extension.down.sql new file mode 100644 index 000000000..f97c0fa3b --- /dev/null +++ b/backend/migrations/000039_add_tigram_extension.down.sql @@ -0,0 +1 @@ +DROP EXTENSION IF EXISTS pg_trgm; diff --git a/backend/migrations/000039_add_tigram_extension.up.sql b/backend/migrations/000039_add_tigram_extension.up.sql new file mode 100644 index 000000000..588aec00f --- /dev/null +++ b/backend/migrations/000039_add_tigram_extension.up.sql @@ -0,0 +1 @@ +CREATE EXTENSION IF NOT EXISTS pg_trgm; From d174fccc3dda582ca0bd6538f8ef50d3c3385d00 Mon Sep 17 00:00:00 2001 From: Richard Melkonian Date: Thu, 8 Sep 2022 15:50:32 +0100 Subject: [PATCH 2/4] implemnted slice type for multiple row results --- backend/main/models/community.go | 22 +++++++++++++++------- backend/main/server/controllers.go | 2 -- backend/main/server/helpers.go | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/backend/main/models/community.go b/backend/main/models/community.go index a116b4693..bc6be3f47 100644 --- a/backend/main/models/community.go +++ b/backend/main/models/community.go @@ -308,21 +308,29 @@ func (c *Community) CanUpdateCommunity(db *s.Database, addr string) error { } func SearchForCommunity(db *s.Database, query string) ([]Community, error) { - var results []Community - + var communities []Community rows, err := db.Conn.Query( db.Context, - `SELECT DISTINCT(event_type) FROM storm_events WHERE DIFFERENCE(event_type, 'test') > 2`, + `SELECT name FROM communities WHERE name % $1`, query, ) if err != nil { - return results, fmt.Errorf("error searching for a community with the the param %s", query) + return communities, fmt.Errorf("error searching for a community with the the param %s", query) } - if err := rows.Scan(results); err != nil { - return []Community{}, fmt.Errorf("could not scan the query results into the community struct, type mismatch") + defer rows.Close() + + for rows.Next() { + var c Community + err = rows.Scan(&c.Name) + if err != nil { + return communities, fmt.Errorf("error scanning community row: %v", err) + } + communities = append(communities, c) } - return results, nil + + fmt.Printf("communitites : %v", communities) + return communities, nil } func MatchStrategyByProposal(s []Strategy, strategyToMatch string) (Strategy, error) { diff --git a/backend/main/server/controllers.go b/backend/main/server/controllers.go index 9f37ef7de..ad3c634d0 100644 --- a/backend/main/server/controllers.go +++ b/backend/main/server/controllers.go @@ -305,8 +305,6 @@ func (a *App) searchCommunities(w http.ResponseWriter, r *http.Request) { respondWithError(w, http.StatusInternalServerError, err.Error()) } - fmt.Printf("results: %v \n", results) - respondWithJSON(w, http.StatusOK, results) } diff --git a/backend/main/server/helpers.go b/backend/main/server/helpers.go index e79bf1dda..2c81bfe8b 100644 --- a/backend/main/server/helpers.go +++ b/backend/main/server/helpers.go @@ -441,7 +441,7 @@ func (h *Helpers) fetchCommunity(id int) (models.Community, int, error) { return community, http.StatusOK, nil } -func (h *Helpers) searchCommuntities(query string) ([]models.Community, error) { +func (h *Helpers) searchCommuntities(query string) (interface{}, error) { results, err := models.SearchForCommunity(h.A.DB, query) if err != nil { return []models.Community{}, err From 639e89391d7c57e7cc8ca48aa97c65f6d20fe283 Mon Sep 17 00:00:00 2001 From: Richard Melkonian Date: Thu, 8 Sep 2022 18:28:47 +0100 Subject: [PATCH 3/4] adjusted search query, updated migrations --- backend/main/models/community.go | 2 +- backend/migrations/000039_add_tigram_extension.down.sql | 1 + backend/migrations/000039_add_tigram_extension.up.sql | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/main/models/community.go b/backend/main/models/community.go index bc6be3f47..e767bc8ac 100644 --- a/backend/main/models/community.go +++ b/backend/main/models/community.go @@ -311,7 +311,7 @@ func SearchForCommunity(db *s.Database, query string) ([]Community, error) { var communities []Community rows, err := db.Conn.Query( db.Context, - `SELECT name FROM communities WHERE name % $1`, + `SELECT name FROM communities WHERE SIMILARITY(name, $1) > 0.1`, query, ) if err != nil { diff --git a/backend/migrations/000039_add_tigram_extension.down.sql b/backend/migrations/000039_add_tigram_extension.down.sql index f97c0fa3b..71e2b37ef 100644 --- a/backend/migrations/000039_add_tigram_extension.down.sql +++ b/backend/migrations/000039_add_tigram_extension.down.sql @@ -1 +1,2 @@ DROP EXTENSION IF EXISTS pg_trgm; +DROP INDEX IF EXISTS trgm_idx; diff --git a/backend/migrations/000039_add_tigram_extension.up.sql b/backend/migrations/000039_add_tigram_extension.up.sql index 588aec00f..f7b451ec0 100644 --- a/backend/migrations/000039_add_tigram_extension.up.sql +++ b/backend/migrations/000039_add_tigram_extension.up.sql @@ -1 +1,2 @@ CREATE EXTENSION IF NOT EXISTS pg_trgm; +CREATE INDEX IF NOT EXISTS trgm_idx on communities using gin(name gin_trgm_ops); From 7dc171ff5ba5d3a7d18c6ae4b5dc887ace8b2156 Mon Sep 17 00:00:00 2001 From: Richard Melkonian Date: Fri, 9 Sep 2022 18:01:34 +0100 Subject: [PATCH 4/4] updated migration file number --- ...am_extension.down.sql => 000040_add_tigram_extension.down.sql} | 0 ...tigram_extension.up.sql => 000040_add_tigram_extension.up.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename backend/migrations/{000039_add_tigram_extension.down.sql => 000040_add_tigram_extension.down.sql} (100%) rename backend/migrations/{000039_add_tigram_extension.up.sql => 000040_add_tigram_extension.up.sql} (100%) diff --git a/backend/migrations/000039_add_tigram_extension.down.sql b/backend/migrations/000040_add_tigram_extension.down.sql similarity index 100% rename from backend/migrations/000039_add_tigram_extension.down.sql rename to backend/migrations/000040_add_tigram_extension.down.sql diff --git a/backend/migrations/000039_add_tigram_extension.up.sql b/backend/migrations/000040_add_tigram_extension.up.sql similarity index 100% rename from backend/migrations/000039_add_tigram_extension.up.sql rename to backend/migrations/000040_add_tigram_extension.up.sql