aboutsummaryrefslogtreecommitdiff
path: root/src/services/api/api.service.js
blob: 3eb8c62aa4ed32468c47fe07b4682140233cedb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
const LOGIN_URL='/api/account/verify_credentials.json';
const FRIENDS_TIMELINE_URL='/api/statuses/friends_timeline.json';
const PUBLIC_TIMELINE_URL='/api/statuses/public_timeline.json';
const PUBLIC_AND_EXTERNAL_TIMELINE_URL='/api/statuses/public_and_external_timeline.json';
const CONVERSATION_URL = '/api/statusnet/conversation/';
const STATUS_UPDATE_URL = '/api/statuses/update.json';
const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload';
const FAVORITE_URL = '/api/favorites/create';
const UNFAVORITE_URL = '/api/favorites/destroy';

const FORM_CONTENT_TYPE = {'Content-Type': 'application/x-www-form-urlencoded'};

import { param, ajax } from 'jquery';
import { merge } from 'lodash';

// TODO: This should probably be in redux.
let authHeaders = {};

const apiServiceFactory = ($http) => {
  // Public
  const fetchConversation = (id) => {
    return $http.get(`${CONVERSATION_URL}/${id}.json?count=100`);
  };

  const fetchTimeline = ({timeline, since = false, until = false}) => {
    const timelineUrls = {
      public: PUBLIC_TIMELINE_URL,
      friends: FRIENDS_TIMELINE_URL,
      'public-and-external': PUBLIC_AND_EXTERNAL_TIMELINE_URL
    };

    let url = timelineUrls[timeline];

    if(since) {
      url += `?since_id=${since}`;
    }

    if(until) {
      url += `?max_id=${until}`;
    }

    return fetch(url, { headers: authHeaders }).then((data) => data.json());
  };

  // Need credentials
  const verifyCredentials = (user) => {
    const base64 = btoa(`${user.username}:${user.password}`);
    authHeaders = { "Authorization": `Basic ${base64}` };
    return $http.post(LOGIN_URL, null, { headers: authHeaders });
  };

  const postStatus = ({status, mediaIds, in_reply_to_status_id}) => {
    const idsText = mediaIds.join(',');
    const form = new FormData();

    form.append('status', status);
    form.append('source', 'The Wired FE');
    form.append('media_ids', idsText);
    if(in_reply_to_status_id) {
      form.append('in_reply_to_status_id', in_reply_to_status_id);
    };

    return fetch(STATUS_UPDATE_URL, {
      body: form,
      method: 'POST',
      headers: authHeaders
    });
  };

  const favorite = (id) => $http.post(`${FAVORITE_URL}/${id}.json`, null, {headers: authHeaders});
  const unfavorite = (id) => $http.post(`${UNFAVORITE_URL}/${id}.json`, null, {headers: authHeaders});

  // This was impossible to get to work with $http. You're supposed to set Content-Type
  // undefined in the header so it sends the correct header. It would always send a json
  // content type. This method from jQuery worked right away...
  // Also, this method is only available as XML output. OLOLOLOLO
  const uploadMedia = (formData) => ajax({
    url: MEDIA_UPLOAD_URL,
    data: formData,
    type: 'POST',
    processData: false,
    contentType: false,
    headers: authHeaders
  });

  const apiService = {
    verifyCredentials,
    fetchConversation,
    postStatus,
    uploadMedia,
    favorite,
    unfavorite,
    fetchTimeline
  };

  return apiService;
};

apiServiceFactory.$inject = ['$http'];

export default apiServiceFactory;