Merge pull request #1581 from nextcloud/artonge/feat/use_new_api

Use new timeline API
pull/1583/head
Maxence Lange 2023-01-16 15:46:24 -01:00 zatwierdzone przez GitHub
commit 6eb5150698
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 65 dodań i 39 usunięć

Wyświetl plik

@ -83,6 +83,7 @@ return [
['name' => 'Api#notifications', 'url' => '/api/v1/notifications', 'verb' => 'GET'],
['name' => 'Api#tag', 'url' => '/api/v1/timelines/tag/{hashtag}', 'verb' => 'GET'],
['name' => 'Api#statusNew', 'url' => '/api/v1/statuses', 'verb' => 'POST'],
['name' => 'Api#timelines', 'url' => '/api/v1/timelines/{timeline}/', 'verb' => 'GET'],
// Api for local front-end
// TODO: front-end should be using the new ApiController

Wyświetl plik

@ -248,6 +248,7 @@ class ApiController extends Controller {
* @param int $limit
* @param int $max_id
* @param int $min_id
* @param int $since_id
*
* @return DataResponse
*/
@ -257,7 +258,7 @@ class ApiController extends Controller {
int $limit = 20,
int $max_id = 0,
int $min_id = 0,
int $since = 0
int $since_id = 0
): DataResponse {
try {
$this->initViewer(true);
@ -269,7 +270,7 @@ class ApiController extends Controller {
->setLimit($limit)
->setMaxId($max_id)
->setMinId($min_id)
->setSince($since);
->setSince($since_id);
$posts = $this->streamService->getTimeline($options);
@ -287,7 +288,7 @@ class ApiController extends Controller {
* @param int $limit
* @param int $max_id
* @param int $min_id
* @param int $since
* @param int $since_id
*
* @return DataResponse
*/
@ -295,7 +296,7 @@ class ApiController extends Controller {
int $limit = 20,
int $max_id = 0,
int $min_id = 0,
int $since = 0
int $since_id = 0
): DataResponse {
try {
$this->initViewer(true);
@ -306,7 +307,7 @@ class ApiController extends Controller {
->setLimit($limit)
->setMaxId($max_id)
->setMinId($min_id)
->setSince($since);
->setSince($since_id);
$posts = $this->streamService->getTimeline($options);
@ -327,7 +328,7 @@ class ApiController extends Controller {
int $limit = 20,
int $max_id = 0,
int $min_id = 0,
int $since = 0,
int $since_id = 0,
array $types = [],
array $exclude_types = [],
string $accountId = ''
@ -341,7 +342,7 @@ class ApiController extends Controller {
->setLimit($limit)
->setMaxId($max_id)
->setMinId($min_id)
->setSince($since)
->setSince($since_id)
->setTypes($types)
->setExcludeTypes($exclude_types)
->setAccountId($accountId);
@ -366,7 +367,7 @@ class ApiController extends Controller {
int $limit = 20,
int $max_id = 0,
int $min_id = 0,
int $since = 0,
int $since_id = 0,
bool $local = false,
bool $only_media = false
): DataResponse {
@ -379,7 +380,7 @@ class ApiController extends Controller {
->setLimit($limit)
->setMaxId($max_id)
->setMinId($min_id)
->setSince($since)
->setSince($since_id)
->setLocal($local)
->setOnlyMedia($only_media)
->setArgument($hashtag);

Wyświetl plik

@ -23,10 +23,13 @@
*
*/
import logger from '../services/logger.js'
import axios from '@nextcloud/axios'
import Vue from 'vue'
import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'
import { showError } from '@nextcloud/dialogs'
import logger from '../services/logger.js'
/**
* @property {object} timeline - The posts' collection
@ -48,8 +51,10 @@ const state = {
*/
params: {},
account: '',
/* Tells whether the composer should be displayed or not.
/**
* Tells whether the composer should be displayed or not.
* It's up to the view to honor this status or not.
*
* @member {boolean}
*/
composerDisplayStatus: false,
@ -153,7 +158,7 @@ const actions = {
})
logger.info('Post created with token ' + data.result.token)
} catch (error) {
OC.Notification.showTemporary('Failed to create a post')
showError('Failed to create a post')
logger.error('Failed to create a post', { error: error.response })
}
},
@ -162,7 +167,7 @@ const actions = {
context.commit('removePost', post)
logger.info('Post deleted with token ' + response.data.result.token)
}).catch((error) => {
OC.Notification.showTemporary('Failed to delete the post')
showError('Failed to delete the post')
logger.error('Failed to delete the post', { error })
})
},
@ -172,7 +177,7 @@ const actions = {
context.commit('likePost', { post, parentAnnounce })
resolve(response)
}).catch((error) => {
OC.Notification.showTemporary('Failed to like post')
showError('Failed to like post')
logger.error('Failed to like post', { error: error.response })
reject(error)
})
@ -186,7 +191,7 @@ const actions = {
context.commit('removePost', post)
}
}).catch((error) => {
OC.Notification.showTemporary('Failed to unlike post')
showError('Failed to unlike post')
logger.error('Failed to unlike post', { error })
})
},
@ -197,7 +202,7 @@ const actions = {
logger.info('Post boosted with token ' + response.data.result.token)
resolve(response)
}).catch((error) => {
OC.Notification.showTemporary('Failed to create a boost post')
showError('Failed to create a boost post')
logger.error('Failed to create a boost post', { error: error.response })
reject(error)
})
@ -208,43 +213,62 @@ const actions = {
context.commit('unboostPost', { post, parentAnnounce })
logger.info('Boost deleted with token ' + response.data.result.token)
}).catch((error) => {
OC.Notification.showTemporary('Failed to delete the boost')
showError('Failed to delete the boost')
logger.error('Failed to delete the boost', { error })
})
},
refreshTimeline(context) {
return this.dispatch('fetchTimeline', { sinceTimestamp: Math.floor(Date.now() / 1000) + 1 })
},
fetchTimeline(context, { sinceTimestamp }) {
if (typeof sinceTimestamp === 'undefined') {
sinceTimestamp = state.since - 1
/**
*
* @param {object} context
* @param {object} params - see https://docs.joinmastodon.org/methods/timelines
* @param {number} [params.since_id] - Fetch results newer than ID
* @param {number} [params.max_id] - Fetch results older than ID
* @param {number} [params.min_id] - Fetch results immediately newer than ID
* @param {number} [params.limit] - Maximum number of results to return. Defaults to 20 statuses. Max 40 statuses
* @param {number} [params.local] - Show only local statuses? Defaults to false.
* @return {Promise<object>}
*/
async fetchTimeline(context, params = {}) {
if (params.since_id === undefined) {
params.since_id = state.since_id - 1
}
// Compute URl to get the data
if (params.limit === undefined) {
params.limit = 15
}
// Compute URL to get the data
let url = ''
if (state.type === 'account') {
url = generateUrl(`apps/social/api/v1/account/${state.account}/stream?limit=25&since=` + sinceTimestamp)
} else if (state.type === 'tags') {
url = generateUrl(`apps/social/api/v1/stream/tag/${state.params.tag}?limit=25&since=` + sinceTimestamp)
} else if (state.type === 'single-post') {
url = generateUrl(`apps/social/local/v1/post/replies?id=${state.params.id}&limit=5&since=` + sinceTimestamp)
} else {
url = generateUrl(`apps/social/api/v1/stream/${state.type}?limit=25&since=` + sinceTimestamp)
switch (state.type) {
case 'account':
// TODO: wait for maxence
url = generateUrl(`apps/social/api/v1/timelines/${state.account}`, params)
break
case 'tags':
url = generateUrl(`apps/social/api/v1/timelines/tag/${state.params.tag}`, params)
break
case 'single-post':
// TODO: wait for maxence
url = generateUrl(`apps/social/local/v1/post/replies?id=${state.params.id}`, params)
break
default:
url = generateUrl(`apps/social/api/v1/timelines/${state.type}`, params)
}
// Get the data and add them to the timeline
return axios.get(url).then((response) => {
const response = await axios.get(url)
if (response.status === -1) {
throw response.message
}
if (response.status === -1) {
throw response.message
}
// Add results to timeline
context.commit('addToTimeline', response.data.result)
// Add results to timeline
context.commit('addToTimeline', response.data.result)
return response.data
})
return response.data
},
addToTimeline(context, data) {
context.commit('addToTimeline', data)