github.com/status-im/status-go@v1.1.0/services/gif/gif.go (about)

     1  package gif
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"time"
     9  
    10  	"github.com/ethereum/go-ethereum/log"
    11  	"github.com/status-im/status-go/multiaccounts/accounts"
    12  	"github.com/status-im/status-go/multiaccounts/settings"
    13  )
    14  
    15  type Gif struct {
    16  	ID         string `json:"id"`
    17  	Title      string `json:"title"`
    18  	URL        string `json:"url"`
    19  	TinyURL    string `json:"tinyUrl"`
    20  	Height     int    `json:"height"`
    21  	IsFavorite bool   `json:"isFavorite"`
    22  }
    23  
    24  type Container struct {
    25  	Items []Gif `json:"items"`
    26  }
    27  
    28  var tenorAPIKey = ""
    29  var defaultParams = "&media_filter=minimal&limit=50&key="
    30  
    31  const maxRetry = 3
    32  const baseURL = "https://g.tenor.com/v1/"
    33  
    34  func NewGifAPI(db *accounts.Database) *API {
    35  	return &API{db}
    36  }
    37  
    38  // API is class with methods available over RPC.
    39  type API struct {
    40  	db *accounts.Database
    41  }
    42  
    43  func (api *API) SetTenorAPIKey(key string) (err error) {
    44  	log.Info("[GifAPI::SetTenorAPIKey]")
    45  	err = api.db.SaveSettingField(settings.GifAPIKey, key)
    46  	if err != nil {
    47  		return err
    48  	}
    49  	tenorAPIKey = key
    50  	return nil
    51  }
    52  
    53  func (api *API) GetContentWithRetry(path string) (value string, err error) {
    54  	var currentRetry = 0
    55  	var response *http.Response
    56  	for currentRetry < maxRetry {
    57  		transport := &http.Transport{
    58  			Proxy:                 http.ProxyFromEnvironment,
    59  			ResponseHeaderTimeout: time.Second * 1,
    60  		}
    61  
    62  		client := http.Client{
    63  			Timeout:   1 * time.Second,
    64  			Transport: transport,
    65  		}
    66  
    67  		response, err = client.Get(baseURL + path + defaultParams + tenorAPIKey)
    68  
    69  		if err != nil {
    70  			log.Error("can't get content from path %s with %s", path, err.Error())
    71  			currentRetry++
    72  			time.Sleep(100 * time.Millisecond)
    73  		} else {
    74  			break
    75  		}
    76  	}
    77  
    78  	if response == nil {
    79  		return "", fmt.Errorf("Could not reach Tenor API")
    80  	}
    81  	defer response.Body.Close()
    82  
    83  	if response.StatusCode != http.StatusOK {
    84  		return "", fmt.Errorf("Status error: %v", response.StatusCode)
    85  	}
    86  
    87  	data, err := ioutil.ReadAll(response.Body)
    88  	if err != nil {
    89  		return "", fmt.Errorf("Read body: %v", err)
    90  	}
    91  
    92  	return string(data), nil
    93  }
    94  
    95  func (api *API) FetchGifs(path string) (value string, err error) {
    96  	log.Info("[GifAPI::fetchGifs]")
    97  	return api.GetContentWithRetry(path)
    98  }
    99  
   100  func (api *API) UpdateRecentGifs(updatedGifs json.RawMessage) (err error) {
   101  	log.Info("[GifAPI::updateRecentGifs]")
   102  	recentGifsContainer := Container{}
   103  	err = json.Unmarshal(updatedGifs, &recentGifsContainer)
   104  	if err != nil {
   105  		return err
   106  	}
   107  	err = api.db.SaveSettingField(settings.GifRecents, recentGifsContainer.Items)
   108  	if err != nil {
   109  		return err
   110  	}
   111  	return nil
   112  }
   113  
   114  func (api *API) UpdateFavoriteGifs(updatedGifs json.RawMessage) (err error) {
   115  	log.Info("[GifAPI::updateFavoriteGifs]", updatedGifs)
   116  	favsGifsContainer := Container{}
   117  	err = json.Unmarshal(updatedGifs, &favsGifsContainer)
   118  	if err != nil {
   119  		return err
   120  	}
   121  	err = api.db.SaveSettingField(settings.GifFavourites, favsGifsContainer.Items)
   122  	if err != nil {
   123  		return err
   124  	}
   125  	return nil
   126  }
   127  
   128  func (api *API) GetRecentGifs() (recentGifs []Gif, err error) {
   129  	log.Info("[GifAPI::getRecentGifs]")
   130  	gifs, err := api.db.GifRecents()
   131  	if err != nil {
   132  		return nil, err
   133  	}
   134  	recentGifs = make([]Gif, 0)
   135  	savedRecentGifs := []Gif{}
   136  	if len(gifs) > 0 {
   137  		err = json.Unmarshal(gifs, &savedRecentGifs)
   138  		if err != nil {
   139  			return nil, err
   140  		}
   141  		recentGifs = savedRecentGifs
   142  	}
   143  	return recentGifs, nil
   144  }
   145  
   146  func (api *API) GetFavoriteGifs() (favoriteGifs []Gif, err error) {
   147  	log.Info("[GifAPI::getFavoriteGifs]")
   148  	gifs, err := api.db.GifFavorites()
   149  	if err != nil {
   150  		return nil, err
   151  	}
   152  	favoriteGifs = make([]Gif, 0)
   153  	savedFavGifs := []Gif{}
   154  	if len(gifs) > 0 {
   155  		err = json.Unmarshal(gifs, &savedFavGifs)
   156  		if err != nil {
   157  			return nil, err
   158  		}
   159  		favoriteGifs = savedFavGifs
   160  	}
   161  	return favoriteGifs, nil
   162  }