From db7395b5021e1768ea666a41c8ea5528ecec404e Mon Sep 17 00:00:00 2001 From: Sol Fisher Romanoff Date: Sun, 13 Nov 2022 20:04:17 +0200 Subject: [PATCH] Implement admin user list API endpoint --- src/modules/users.js | 12 ++++++++++ src/services/api/api.service.js | 24 +++++++++++++++++++ .../entity_normalizer.service.js | 10 ++++++++ 3 files changed, 46 insertions(+) diff --git a/src/modules/users.js b/src/modules/users.js index c63b93de..c236d600 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -185,6 +185,9 @@ export const mutations = { user['followedTagIds'] = [] } }, + adminSetUsers (state, users) { + state.adminUsers = users + }, addNewUsers (state, users) { each(users, (user) => { if (user.relationship) { @@ -294,6 +297,7 @@ export const defaultState = { currentUser: false, users: [], usersObject: {}, + adminUsers: [], signUpPending: false, signUpErrors: [], relationships: {}, @@ -306,6 +310,14 @@ const users = { mutations, getters, actions: { + fetchUsers (store, params = false) { + return store.rootState.api.backendInteractor.fetchUsers(params) + .then((users) => { + store.commit('adminSetUsers', users) + users.forEach(user => store.dispatch('fetchUserIfMissing', user.id)) + return users + }) + }, fetchUserIfMissing (store, id) { if (!store.getters.findUser(id)) { store.dispatch('fetchUser', id) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 0f8b75a4..da4cc238 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -557,6 +557,29 @@ const fetchStatusHistory = ({ status, credentials }) => { }) } +const fetchUsers = ({ filters, name, page, actorTypes, credentials }) => { + const url = ADMIN_USERS_URL + const params = [] + + if (filters) { + params.push(['filters', filters.join(',')]) + } + if (name) { + params.push(['name', name]) + } + if (page) { + params.push(['page', page]) + } + if (actorTypes) { + actorTypes.forEach(type => (params.push(['actor_types[]', type]))) + } + + const queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&') + return promisedRequest({ url: url + `?${queryString}`, credentials }) + .then((data) => data.users) + .then((data) => data.map(parseUser)) +} + const tagUser = ({ tag, credentials, user }) => { const screenName = user.screen_name const form = { @@ -1762,6 +1785,7 @@ const apiService = { fetchBlocks, fetchOAuthTokens, revokeOAuthToken, + fetchUsers, tagUser, untagUser, deleteUser, diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index c54ce3e2..04a474a8 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -43,6 +43,9 @@ export const parseUser = (data) => { // case for users in "mentions" property for statuses in MastoAPI const mastoShort = masto && !data.hasOwnProperty('avatar') + // account format from the admin API + const admin = data.hasOwnProperty('actor_type') + output.id = String(data.id) output._original = data // used for server-side settings @@ -139,6 +142,13 @@ export const parseUser = (data) => { // TODO: handle is_local output.is_local = !output.screen_name.includes('@') + } else if (admin) { + output.screen_name = data.nickname + output.name = data.display_name + output.profile_image_url = data.avatar + output.profile_image_url_original = data.avatar + output.is_local = data.local + output.emoji = [] } else { output.screen_name = data.screen_name