aboutsummaryrefslogtreecommitdiff
path: root/src/services
diff options
context:
space:
mode:
Diffstat (limited to 'src/services')
-rw-r--r--src/services/api/api.service.js18
-rw-r--r--src/services/new_api/oauth.js82
-rw-r--r--src/services/new_api/user_search.js16
-rw-r--r--src/services/new_api/utils.js36
4 files changed, 139 insertions, 13 deletions
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index ab746918..714c0fc7 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -15,6 +15,7 @@ const STATUS_URL = '/api/statuses/show'
const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload'
const CONVERSATION_URL = '/api/statusnet/conversation'
const MENTIONS_URL = '/api/statuses/mentions.json'
+const DM_TIMELINE_URL = '/api/statuses/dm_timeline.json'
const FOLLOWERS_URL = '/api/statuses/followers.json'
const FRIENDS_URL = '/api/statuses/friends.json'
const FOLLOWING_URL = '/api/friendships/create.json'
@@ -52,16 +53,6 @@ let fetch = (url, options) => {
return oldfetch(fullUrl, options)
}
-// from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
-let utoa = (str) => {
- // first we use encodeURIComponent to get percent-encoded UTF-8,
- // then we convert the percent encodings into raw bytes which
- // can be fed into btoa.
- return btoa(encodeURIComponent(str)
- .replace(/%([0-9A-F]{2})/g,
- (match, p1) => { return String.fromCharCode('0x' + p1) }))
-}
-
// Params
// cropH
// cropW
@@ -175,9 +166,9 @@ const register = (params) => {
})
}
-const authHeaders = (user) => {
- if (user && user.username && user.password) {
- return { 'Authorization': `Basic ${utoa(`${user.username}:${user.password}`)}` }
+const authHeaders = (accessToken) => {
+ if (accessToken) {
+ return { 'Authorization': `Bearer ${accessToken}` }
} else {
return { }
}
@@ -302,6 +293,7 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use
public: PUBLIC_TIMELINE_URL,
friends: FRIENDS_TIMELINE_URL,
mentions: MENTIONS_URL,
+ dms: DM_TIMELINE_URL,
notifications: QVITTER_USER_NOTIFICATIONS_URL,
'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL,
user: QVITTER_USER_TIMELINE_URL,
diff --git a/src/services/new_api/oauth.js b/src/services/new_api/oauth.js
new file mode 100644
index 00000000..9e656507
--- /dev/null
+++ b/src/services/new_api/oauth.js
@@ -0,0 +1,82 @@
+import {reduce} from 'lodash'
+
+const getOrCreateApp = ({oauth, instance}) => {
+ const url = `${instance}/api/v1/apps`
+ const form = new window.FormData()
+
+ form.append('client_name', `PleromaFE_${Math.random()}`)
+ form.append('redirect_uris', `${window.location.origin}/oauth-callback`)
+ form.append('scopes', 'read write follow')
+
+ return window.fetch(url, {
+ method: 'POST',
+ body: form
+ }).then((data) => data.json())
+}
+const login = (args) => {
+ getOrCreateApp(args).then((app) => {
+ args.commit('setClientData', app)
+
+ const data = {
+ response_type: 'code',
+ client_id: app.client_id,
+ redirect_uri: app.redirect_uri,
+ scope: 'read write follow'
+ }
+
+ const dataString = reduce(data, (acc, v, k) => {
+ const encoded = `${k}=${encodeURIComponent(v)}`
+ if (!acc) {
+ return encoded
+ } else {
+ return `${acc}&${encoded}`
+ }
+ }, false)
+
+ // Do the redirect...
+ const url = `${args.instance}/oauth/authorize?${dataString}`
+
+ window.location.href = url
+ })
+}
+
+const getTokenWithCredentials = ({app, instance, username, password}) => {
+ const url = `${instance}/oauth/token`
+ const form = new window.FormData()
+
+ form.append('client_id', app.client_id)
+ form.append('client_secret', app.client_secret)
+ form.append('grant_type', 'password')
+ form.append('username', username)
+ form.append('password', password)
+
+ return window.fetch(url, {
+ method: 'POST',
+ body: form
+ }).then((data) => data.json())
+}
+
+const getToken = ({app, instance, code}) => {
+ const url = `${instance}/oauth/token`
+ const form = new window.FormData()
+
+ form.append('client_id', app.client_id)
+ form.append('client_secret', app.client_secret)
+ form.append('grant_type', 'authorization_code')
+ form.append('code', code)
+ form.append('redirect_uri', `${window.location.origin}/oauth-callback`)
+
+ return window.fetch(url, {
+ method: 'POST',
+ body: form
+ }).then((data) => data.json())
+}
+
+const oauth = {
+ login,
+ getToken,
+ getTokenWithCredentials,
+ getOrCreateApp
+}
+
+export default oauth
diff --git a/src/services/new_api/user_search.js b/src/services/new_api/user_search.js
new file mode 100644
index 00000000..ce7da88e
--- /dev/null
+++ b/src/services/new_api/user_search.js
@@ -0,0 +1,16 @@
+import utils from './utils.js'
+
+const search = ({query, store}) => {
+ return utils.request({
+ store,
+ url: '/api/pleroma/search_user',
+ params: {
+ query
+ }
+ }).then((data) => data.json())
+}
+const UserSearch = {
+ search
+}
+
+export default UserSearch
diff --git a/src/services/new_api/utils.js b/src/services/new_api/utils.js
new file mode 100644
index 00000000..078f392f
--- /dev/null
+++ b/src/services/new_api/utils.js
@@ -0,0 +1,36 @@
+const queryParams = (params) => {
+ return Object.keys(params)
+ .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k]))
+ .join('&')
+}
+
+const headers = (store) => {
+ const accessToken = store.state.oauth.token
+ if (accessToken) {
+ return {'Authorization': `Bearer ${accessToken}`}
+ } else {
+ return {}
+ }
+}
+
+const request = ({method = 'GET', url, params, store}) => {
+ const instance = store.state.instance.server
+ let fullUrl = `${instance}${url}`
+
+ if (method === 'GET' && params) {
+ fullUrl = fullUrl + `?${queryParams(params)}`
+ }
+
+ return window.fetch(fullUrl, {
+ method,
+ headers: headers(store),
+ credentials: 'same-origin'
+ })
+}
+
+const utils = {
+ queryParams,
+ request
+}
+
+export default utils