Skip to content

Commit daf4764

Browse files
committed
Add search handler
1 parent b2a2a79 commit daf4764

5 files changed

Lines changed: 80 additions & 1 deletion

File tree

backend/circles/handler.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,4 +255,29 @@ func DeleteCircleHandler(w http.ResponseWriter, r *http.Request, hub *websockets
255255

256256
w.WriteHeader(http.StatusOK)
257257
json.NewEncoder(w).Encode("Circle deleted\n")
258+
}
259+
260+
func SearchTextHandler(w http.ResponseWriter, r *http.Request) {
261+
type SearchData struct {
262+
CircleID string `json:"circle_id"`
263+
Content string `json:"content"`
264+
}
265+
var searchData SearchData
266+
err := json.NewDecoder(r.Body).Decode(&searchData)
267+
if err != nil {
268+
fmt.Printf("HTTP 400 bad request\n")
269+
w.WriteHeader(http.StatusBadRequest)
270+
json.NewEncoder(w).Encode("HTTP 400 bad request")
271+
return
272+
}
273+
results, err := postgres.SearchCircle(searchData.CircleID, searchData.Content)
274+
if err != nil {
275+
fmt.Printf("Failed to search circles\n")
276+
w.WriteHeader(http.StatusInternalServerError)
277+
json.NewEncoder(w).Encode("Failed to search circles\n")
278+
return
279+
}
280+
fmt.Printf("Search results: %v\n", results)
281+
w.WriteHeader(http.StatusOK)
282+
json.NewEncoder(w).Encode(results)
258283
}

backend/main.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ func main() {
7272

7373
mux.HandleFunc("/api/register", middleware.AddCorsHeaders(auth.RegisterHandler))
7474
mux.HandleFunc("/api/login", middleware.AddCorsHeaders(auth.LoginHandler))
75+
mux.HandleFunc("/api/circles/search", middleware.AddCorsHeaders(
76+
middleware.AuthMiddleware(
77+
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
78+
circles.SearchTextHandler(w, r)
79+
}),
80+
),
81+
))
7582
mux.Handle("/api/circles", middleware.AddCorsHeaders(
7683
middleware.AuthMiddleware(
7784
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

backend/models/message.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package models
22

3+
import "time"
4+
35
type WebsocketMessage struct {
46
Origin string `json:"origin"` // user or server
57
Type string `json:"type"` // message or circle
@@ -14,3 +16,9 @@ type Message struct {
1416
CreatedAt string `json:"created_at"`
1517
AuthorID string `json:"author_id"`
1618
}
19+
20+
type SearchMessage struct {
21+
Content string `json:"content"`
22+
CreatedAt time.Time `json:"created_at"`
23+
AuthorUsername string `json:"author_username"`
24+
}

backend/postgres/circles_repo.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,3 +350,42 @@ func LoadCircleUserMap() (map[string]map[string]bool, error) {
350350
}
351351
return circleUsers, nil
352352
}
353+
354+
func SearchCircle(circleID string, content string) ([]models.SearchMessage, error) {
355+
ctx := context.Background()
356+
conn, err := pool.Acquire(ctx)
357+
if err != nil {
358+
fmt.Fprintf(os.Stderr, "Unable to acquire a connection from the pool: %v\n", err)
359+
return nil, err
360+
}
361+
defer conn.Release()
362+
363+
rows, err := conn.Query(
364+
ctx,
365+
`
366+
SELECT m.content, m.created_at, u.username
367+
FROM messages m
368+
INNER JOIN users u ON m.author_id = u.id
369+
WHERE m.circle_id = $1 AND m.content ILIKE '%' || $2 || '%';
370+
`,
371+
circleID,
372+
content,
373+
)
374+
if err != nil {
375+
fmt.Fprintf(os.Stderr, "Unable to query PSQL: %v\n", err)
376+
return nil, err
377+
}
378+
defer rows.Close()
379+
380+
var messages []models.SearchMessage
381+
for rows.Next() {
382+
var message models.SearchMessage
383+
err = rows.Scan(&message.Content, &message.CreatedAt, &message.AuthorUsername)
384+
if err != nil {
385+
fmt.Fprintf(os.Stderr, "Unable to scan row: %v\n", err)
386+
return nil, err
387+
}
388+
messages = append(messages, message)
389+
}
390+
return messages, nil
391+
}

frontend/app/components/SearchModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function SearchModal({ isOpen, setOpen, circleId }: SearchModalProps) {
2424
};
2525
const body = {
2626
circle_id: circleId,
27-
content: (e.currentTarget.elements.namedItem('circleName') as HTMLInputElement).value,
27+
content: (document.getElementById("circleName") as HTMLInputElement).value,
2828
};
2929
console.log(body);
3030
fetch('http://localhost:8000/api/circles/search', {

0 commit comments

Comments
 (0)