11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/enhanced_bookmarks/bookmark_server_search_service.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/enhanced_bookmarks/enhanced_bookmark_utils.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/enhanced_bookmarks/proto/search.pb.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/url_util.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_fetcher.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst std::string kSearchUrl(
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    "https://www.google.com/stars/search");
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace enhanced_bookmarks {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBookmarkServerSearchService::BookmarkServerSearchService(
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<net::URLRequestContextGetter> request_context_getter,
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ProfileOAuth2TokenService* token_service,
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SigninManagerBase* signin_manager,
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EnhancedBookmarkModel* enhanced_bookmark_model)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : BookmarkServerService(request_context_getter,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            token_service,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            signin_manager,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            enhanced_bookmark_model) {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBookmarkServerSearchService::~BookmarkServerSearchService() {
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarkServerSearchService::Search(const std::string& query) {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(query.length());
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  current_query_ = query;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TriggerTokenRequest(true);
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::vector<const BookmarkNode*> BookmarkServerSearchService::ResultForQuery(
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& query) {
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(query.length());
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<const BookmarkNode*> result;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::map<std::string, std::vector<std::string> >::iterator it =
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      searches_.find(query);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (it == searches_.end())
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return result;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (std::vector<std::string>::iterator clip_it = it->second.begin();
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       clip_it != it->second.end();
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++clip_it) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* node = BookmarkForRemoteId(*clip_it);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (node)
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      result.push_back(node);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinet::URLFetcher* BookmarkServerSearchService::CreateFetcher() {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add the necessary arguments to the URI.
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL url(kSearchUrl);
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url = net::AppendQueryParameter(url, "output", "proto");
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  url = net::AppendQueryParameter(url, "q", current_query_);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Build the URLFetcher to perform the request.
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::URLFetcher* url_fetcher =
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::URLFetcher::Create(url, net::URLFetcher::GET, this);
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return url_fetcher;
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BookmarkServerSearchService::ProcessResponse(const std::string& response,
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  bool* should_notify) {
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(*should_notify);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(current_query_.length());
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::CorpusSearchResult response_proto;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = response_proto.ParseFromString(response);
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!result)
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;  // Not formatted properly.
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> clip_ids;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (google::protobuf::RepeatedPtrField<
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           image::collections::CorpusSearchResult_ClipResult>::const_iterator
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           it = response_proto.results().begin();
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != response_proto.results().end();
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++it) {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& clip_id = it->clip_id();
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!clip_id.length())
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    clip_ids.push_back(clip_id);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  searches_[current_query_] = clip_ids;
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  current_query_.clear();
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarkServerSearchService::CleanAfterFailure() {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  searches_.clear();
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarkServerSearchService::EnhancedBookmarkAdded(
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* node) {
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  searches_.clear();
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarkServerSearchService::EnhancedBookmarkAllUserNodesRemoved() {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  searches_.clear();
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarkServerSearchService::EnhancedBookmarkRemoteIdChanged(
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* node,
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& old_remote_id,
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& remote_id) {
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  searches_.clear();
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace enhanced_bookmarks
117