@r/api-client
Version:
A wrapper for Reddit's API
107 lines (87 loc) • 2.82 kB
JavaScript
import some from 'lodash/some';
import apiRequest from '../apiBase/apiRequest';
import BadCaptchaError from '../apiBase/errors/BadCaptchaError';
import ValidationError from '../apiBase/errors/ValidationError';
import PostModel from '../models2/PostModel';
import { formatBaseContentQuery } from './BaseContentEndpoint';
const BAD_CAPTCHA = 'BAD_CAPTCHA';
const getPath = (query) => {
if (query.user) {
return `user/${query.user}/submitted.json`;
} else if (query.id) {
return `by_id/${query.id}.json`;
} else if (query.ids) {
return `by_id/${query.ids.join(',')}.json`;
} else if (query.subredditName) {
if (query.sort) {
return `r/${query.subredditName}/${query.sort}.json`;
}
return `r/${query.subredditName}.json`;
} else if (query.multi) {
return `user/${query.multiUser}/m/${query.multi}.json`;
}
return `${query.sort || 'hot'}.json`;
};
const formatQuery = (query, method) => {
formatBaseContentQuery(query, method);
if (method !== 'patch') {
query.feature = 'link_preview';
query.sr_detail = 'true';
}
if (method === 'del') {
query._method = 'post';
}
return query;
};
const formatPostData = (data)=> {
const postData = {
api_type: 'json',
thing_id: data.thingId,
title: data.title,
kind: data.kind,
sendreplies: data.sendreplies,
sr: data.sr,
iden: data.iden,
'g-recaptcha-response': data.gRecaptchaResponse,
resubmit: data.resubmit,
};
if (data.text) {
postData.text = data.text;
} else if (data.url) {
postData.url = data.url;
}
return postData;
};
const handleGet = apiResponse => {
const { body: { data } } = apiResponse.response;
if (data && data.children && data.children[0]) {
if (data.children.length === 1) {
apiResponse.addResult(PostModel.fromJSON(data.children[0].data));
} else {
data.children.forEach(c => apiResponse.addResult(PostModel.fromJSON(c.data)));
}
}
return apiResponse;
};
export default {
get(apiOptions, _query) {
const path = getPath(_query);
const query = formatQuery({ raw_json: 1, ..._query }, 'get');
return apiRequest(apiOptions, 'GET', path, { query }).then(handleGet);
},
post(apiOptions, data) {
const path = 'api/submit';
const query = formatPostData(data);
return apiRequest(apiOptions, 'POST', path, { query })
.then(apiResponse => {
const { body: { json } } = apiResponse.response;
if (json.errors.length && some(json.errors, e => e[0] === BAD_CAPTCHA)) {
throw new BadCaptchaError(data.gRecaptchaResponse, json.captcha, json.errors);
} else if (json.errors.length) {
throw new ValidationError(path, json.errors, 200);
} else {
return apiResponse.response.body;
}
});
},
};