Cancel user search requests to avoid duplicate results being added

Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
Julius Härtl 2020-12-16 10:41:41 +01:00 committed by backportbot[bot]
parent 6c8cd720b8
commit d2e63cd31a
2 changed files with 26 additions and 6 deletions

View File

@ -63,8 +63,8 @@ export default {
requireAdmin() { requireAdmin() {
return confirmPassword() return confirmPassword()
}, },
get(url) { get(url, options) {
return axios.get(sanitize(url)) return axios.get(sanitize(url), options)
}, },
post(url, data) { post(url, data) {
return axios.post(sanitize(url), data) return axios.post(sanitize(url), data)

View File

@ -21,6 +21,7 @@
*/ */
import api from './api' import api from './api'
import axios from '@nextcloud/axios'
import { generateOcsUrl } from '@nextcloud/router' import { generateOcsUrl } from '@nextcloud/router'
const orderGroups = function(groups, orderBy) { const orderGroups = function(groups, orderBy) {
@ -189,6 +190,9 @@ const getters = {
}, },
} }
const CancelToken = axios.CancelToken
let searchRequestCancelSource = null
const actions = { const actions = {
/** /**
@ -203,10 +207,16 @@ const actions = {
* @returns {Promise} * @returns {Promise}
*/ */
getUsers(context, { offset, limit, search, group }) { getUsers(context, { offset, limit, search, group }) {
if (searchRequestCancelSource) {
searchRequestCancelSource.cancel('Operation canceled by another search request.')
}
searchRequestCancelSource = CancelToken.source()
search = typeof search === 'string' ? search : '' search = typeof search === 'string' ? search : ''
group = typeof group === 'string' ? group : '' group = typeof group === 'string' ? group : ''
if (group !== '') { if (group !== '') {
return api.get(generateOcsUrl(`cloud/groups/${encodeURIComponent(encodeURIComponent(group))}/users/details?offset=${offset}&limit=${limit}&search=${search}`, 2)) return api.get(generateOcsUrl(`cloud/groups/${encodeURIComponent(encodeURIComponent(group))}/users/details?offset=${offset}&limit=${limit}&search=${search}`, 2), {
cancelToken: searchRequestCancelSource.token,
})
.then((response) => { .then((response) => {
if (Object.keys(response.data.ocs.data.users).length > 0) { if (Object.keys(response.data.ocs.data.users).length > 0) {
context.commit('appendUsers', response.data.ocs.data.users) context.commit('appendUsers', response.data.ocs.data.users)
@ -214,10 +224,16 @@ const actions = {
} }
return false return false
}) })
.catch((error) => context.commit('API_FAILURE', error)) .catch((error) => {
if (!axios.isCancel(error)) {
context.commit('API_FAILURE', error)
}
})
} }
return api.get(generateOcsUrl(`cloud/users/details?offset=${offset}&limit=${limit}&search=${search}`, 2)) return api.get(generateOcsUrl(`cloud/users/details?offset=${offset}&limit=${limit}&search=${search}`, 2), {
cancelToken: searchRequestCancelSource.token,
})
.then((response) => { .then((response) => {
if (Object.keys(response.data.ocs.data.users).length > 0) { if (Object.keys(response.data.ocs.data.users).length > 0) {
context.commit('appendUsers', response.data.ocs.data.users) context.commit('appendUsers', response.data.ocs.data.users)
@ -225,7 +241,11 @@ const actions = {
} }
return false return false
}) })
.catch((error) => context.commit('API_FAILURE', error)) .catch((error) => {
if (!axios.isCancel(error)) {
context.commit('API_FAILURE', error)
}
})
}, },
getGroups(context, { offset, limit, search }) { getGroups(context, { offset, limit, search }) {