package web import ( "log" "music-server/internal/backend" "net/http" "regexp" "strings" ) var soundtracks_added []string func FindSoundtrackWebHandler(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() if err != nil { http.Error(w, "Bad Request", http.StatusBadRequest) } search_term := r.FormValue("search_term") search(search_term) component := FoundSoundtracks(soundtracks_added) err = component.Render(r.Context(), w) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) log.Fatalf("Error rendering in FindSoundtrackWebHandler: %e", err) } } func search(searchText string) { soundtracks_added = nil soundtracks := backend.GetAllSoundtracks() for _, soundtrack := range soundtracks { if is_match_exact(searchText, soundtrack) { add_soundtrack(soundtrack) } } for _, soundtrack := range soundtracks { if is_match_contains(clean_term(searchText), clean_term(soundtrack)) { add_soundtrack(soundtrack) } } for _, soundtrack := range soundtracks { if is_match_regex(clean_term(searchText), clean_term(soundtrack)) { add_soundtrack(soundtrack) } } } func is_match_exact(search_term string, soundtrack_name string) bool { search_term = strings.ToLower(search_term) soundtrack_name = strings.ToLower(soundtrack_name) if search_term == "" { return true } else if strings.Contains(soundtrack_name, search_term) { return true } else { return false } } func is_match_contains(search_term string, soundtrack_name string) bool { if search_term == "" { return true } else if strings.Contains(soundtrack_name, search_term) { return true } else { return false } } func is_match_regex(search_term string, soundtrack_name string) bool { if search_term == "" { return true } else if compile_regex(search_term).MatchString(soundtrack_name) { return true } else { return false } } func add_soundtrack(soundtrack string) { if !check_if_soundtrack_exists(soundtrack) { soundtracks_added = append(soundtracks_added, soundtrack) } } func check_if_soundtrack_exists(soundtrackName string) bool { soundtrack_exists := false for _, child := range soundtracks_added { if child == soundtrackName { soundtrack_exists = true } } return soundtrack_exists } func compile_regex(search_term string) *regexp.Regexp { regText := ".*" for _, letter := range search_term { regText += string(letter) + ".*" } r, _ := regexp.Compile(regText) return r } func clean_term(term string) string { term = strings.ReplaceAll(term, " ", "") term = strings.ReplaceAll(term, "é", "e") term = strings.ReplaceAll(term, "+", "plus") term = strings.ReplaceAll(term, "&", "and") term = strings.ReplaceAll(term, "'n", "and") return strings.ToLower(term) }