
New localDbSvc.getWorkspaceItems method used to export workspaces. Added offline availability in the workspace management modal. New accordion in the badge management modal. Add badge creation checks in unit tests.
112 lines
2.9 KiB
JavaScript
112 lines
2.9 KiB
JavaScript
import networkSvc from '../../networkSvc';
|
|
import store from '../../../store';
|
|
import badgeSvc from '../../badgeSvc';
|
|
|
|
const tokenExpirationMargin = 5 * 60 * 1000; // 5 min (WordPress tokens expire after 2 weeks)
|
|
|
|
const request = (token, options) => networkSvc.request({
|
|
...options,
|
|
headers: {
|
|
...options.headers || {},
|
|
Authorization: `Bearer ${token.accessToken}`,
|
|
},
|
|
})
|
|
.then(res => res.body);
|
|
|
|
export default {
|
|
/**
|
|
* https://developer.wordpress.com/docs/oauth2/
|
|
*/
|
|
async startOauth2(sub = null, silent = false) {
|
|
const clientId = store.getters['data/serverConf'].wordpressClientId;
|
|
|
|
// Get an OAuth2 code
|
|
const { accessToken, expiresIn } = await networkSvc.startOauth2(
|
|
'https://public-api.wordpress.com/oauth2/authorize',
|
|
{
|
|
client_id: clientId,
|
|
response_type: 'token',
|
|
scope: 'global',
|
|
},
|
|
silent,
|
|
);
|
|
|
|
// Call the user info endpoint
|
|
const body = await request({ accessToken }, {
|
|
url: 'https://public-api.wordpress.com/rest/v1.1/me',
|
|
});
|
|
|
|
// Check the returned sub consistency
|
|
if (sub && `${body.ID}` !== sub) {
|
|
throw new Error('WordPress account ID not expected.');
|
|
}
|
|
// Build token object including scopes and sub
|
|
const token = {
|
|
accessToken,
|
|
expiresOn: Date.now() + (expiresIn * 1000),
|
|
name: body.display_name,
|
|
sub: `${body.ID}`,
|
|
};
|
|
// Add token to wordpress tokens
|
|
store.dispatch('data/addWordpressToken', token);
|
|
return token;
|
|
},
|
|
async refreshToken(token) {
|
|
const { sub } = token;
|
|
const lastToken = store.getters['data/wordpressTokensBySub'][sub];
|
|
|
|
if (lastToken.expiresOn > Date.now() + tokenExpirationMargin) {
|
|
return lastToken;
|
|
}
|
|
// Existing token is going to expire.
|
|
// Try to get a new token in background
|
|
await store.dispatch('modal/open', {
|
|
type: 'providerRedirection',
|
|
name: 'WordPress',
|
|
});
|
|
return this.startOauth2(sub);
|
|
},
|
|
async addAccount(fullAccess = false) {
|
|
const token = await this.startOauth2(fullAccess);
|
|
badgeSvc.addBadge('addWordpressAccount');
|
|
return token;
|
|
},
|
|
|
|
/**
|
|
* https://developer.wordpress.com/docs/api/1.2/post/sites/%24site/posts/new/
|
|
* https://developer.wordpress.com/docs/api/1.2/post/sites/%24site/posts/%24post_ID/
|
|
*/
|
|
async uploadPost({
|
|
token,
|
|
domain,
|
|
siteId,
|
|
postId,
|
|
title,
|
|
content,
|
|
tags,
|
|
categories,
|
|
excerpt,
|
|
author,
|
|
featuredImage,
|
|
status,
|
|
date,
|
|
}) {
|
|
const refreshedToken = await this.refreshToken(token);
|
|
return request(refreshedToken, {
|
|
method: 'POST',
|
|
url: `https://public-api.wordpress.com/rest/v1.2/sites/${siteId || domain}/posts/${postId || 'new'}`,
|
|
body: {
|
|
content,
|
|
title,
|
|
tags,
|
|
categories,
|
|
excerpt,
|
|
author,
|
|
featured_image: featuredImage || '',
|
|
status,
|
|
date: date && date.toISOString(),
|
|
},
|
|
});
|
|
},
|
|
};
|