cleaned up, refactored and implemented new <ModerationTools>

This commit is contained in:
Henry Jameson 2026-06-10 01:58:49 +03:00
commit e56ea2dbeb
23 changed files with 1124 additions and 975 deletions

View file

@ -19,23 +19,14 @@ export const newUserFlags = {
export const useAdminSettingsStore = defineStore('adminSettings', {
state: () => ({
...cloneDeep(defaultState),
backendInteractor: window.vuex.state.api.backendInteractor,
}),
actions: {
// Configuration Stuff
setInstanceAdminNoDbConfig() {
this.loaded = false
this.dbConfigEnabled = false
},
setAvailableFrontends({ frontends }) {
this.frontends = frontends.map((f) => {
f.installedRefs = f.installed_refs
if (f.name === 'pleroma-fe') {
f.refs = ['master', 'develop']
} else {
f.refs = [f.ref]
}
return f
})
},
updateAdminSettings({ config, modifiedPaths }) {
this.loaded = true
this.dbConfigEnabled = true
@ -59,144 +50,23 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
resetAdminDraft() {
this.draft = cloneDeep(this.config)
},
async fetchAdminUsers(opts) {
const data = await window.vuex.state.api.backendInteractor.adminListUsers(
{
opts,
},
)
data.users.forEach((user) =>
window.vuex.dispatch('fetchUserIfMissing', user.id),
)
return data
},
adminAddUserToAdminGroup(user) {
window.vuex.state.api.backendInteractor
.adminAddUserToAdminGroup({ user })
.then((res) =>
window.vuex.commit('updateRight', {
user,
right: 'admin',
value: res.is_admin,
}),
)
},
adminRemoveUserFromAdminGroup(user) {
// prevent revokation of own rights
if (user.id !== window.vuex.state.users.currentUser.id) {
return window.vuex.state.api.backendInteractor
.adminRemoveUserFromAdminGroup({ user })
.then((res) =>
window.vuex.commit('updateRight', {
user,
right: 'admin',
value: res.is_admin,
}),
)
}
},
adminAddUserToModeratorGroup(user) {
return window.vuex.state.api.backendInteractor
.adminAddUserToModeratorGroup({ user })
.then((res) =>
window.vuex.commit('updateRight', {
user,
right: 'moderator',
value: res.is_moderator,
}),
)
},
adminRemoveUserFromModeratorGroup(user) {
// prevent revokation of own rights
if (user.id !== window.vuex.state.users.currentUser.id) {
return window.vuex.state.api.backendInteractor
.adminRemoveUserFromModeratorGroup({ user })
.then((res) =>
window.vuex.commit('updateRight', {
user,
right: 'moderator',
value: res.is_moderator,
}),
)
}
},
adminActivateUser(user) {
return window.vuex.state.api.backendInteractor
.activateUser({ user })
.then((res) => {
const deactivated = !res.is_active
window.vuex.commit('updateActivationStatus', { user, deactivated })
})
},
adminDeactivateUser(user) {
return window.vuex.state.api.backendInteractor
.deactivateUser({ user })
.then((res) => {
const deactivated = !res.is_active
window.vuex.commit('updateActivationStatus', { user, deactivated })
})
},
adminDeleteUser(user) {
return window.vuex.state.api.backendInteractor.deleteUser({ user })
},
adminConfirmUser(user) {
return window.vuex.state.api.backendInteractor
.adminConfirmUser({ user })
.then(() => window.vuex.dispatch('fetchUser', user.id))
},
adminResendConfirmationEmail(user) {
return window.vuex.state.api.backendInteractor.adminResendConfirmationEmail(
{ user },
)
},
adminApproveUser(user) {
return window.vuex.state.api.backendInteractor.adminApproveUser({ user })
},
adminListStatuses({ userId, opts }) {
return window.vuex.state.api.backendInteractor.adminListStatuses({
userId,
opts,
})
},
adminChangeStatusScope({ opts }) {
return window.vuex.state.api.backendInteractor.adminChangeStatusScope({
opts,
})
},
adminDisableMFA(user) {
return window.vuex.state.api.backendInteractor.adminDisableMFA({ user })
},
adminTagUser({ user, tag }) {
return window.vuex.state.api.backendInteractor.tagUser({ user, tag })
},
adminUntagUser({ user, tag }) {
return window.vuex.state.api.backendInteractor.untagUser({ user, tag })
},
loadFrontendsStuff() {
window.vuex.state.api.backendInteractor
.fetchAvailableFrontends()
.then((frontends) => this.setAvailableFrontends({ frontends }))
},
loadAdminStuff() {
window.vuex.state.api.backendInteractor
.fetchInstanceDBConfig()
.then((backendDbConfig) => {
if (backendDbConfig.error) {
if (backendDbConfig.error.status === 400) {
backendDbConfig.error.json().then((errorJson) => {
if (/configurable_from_database/.test(errorJson.error)) {
this.setInstanceAdminNoDbConfig()
}
})
}
} else {
this.setInstanceAdminSettings({ backendDbConfig })
this.backendInteractor.fetchInstanceDBConfig().then((backendDbConfig) => {
if (backendDbConfig.error) {
if (backendDbConfig.error.status === 400) {
backendDbConfig.error.json().then((errorJson) => {
if (/configurable_from_database/.test(errorJson.error)) {
this.setInstanceAdminNoDbConfig()
}
})
}
})
} else {
this.setInstanceAdminSettings({ backendDbConfig })
}
})
if (this.descriptions === null) {
window.vuex.state.api.backendInteractor
this.backendInteractor
.fetchInstanceConfigDescriptions()
.then((backendDescriptions) =>
this.setInstanceAdminDescriptions({ backendDescriptions }),
@ -408,5 +278,172 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
this.setInstanceAdminSettings({ backendDbConfig }),
)
},
// Frontends Stuff
loadFrontendsStuff() {
this.backendInteractor
.fetchAvailableFrontends()
.then((frontends) => this.setAvailableFrontends({ frontends }))
},
setAvailableFrontends({ frontends }) {
this.frontends = frontends.map((f) => {
f.installedRefs = f.installed_refs
if (f.name === 'pleroma-fe') {
f.refs = ['master', 'develop']
} else {
f.refs = [f.ref]
}
return f
})
},
// Statuses stuff
listStatuses({ userId, opts }) {
return this.backendInteractor.adminListStatuses({
userId,
opts,
})
},
changeStatusScope({ opts }) {
return this.backendInteractor.adminChangeStatusScope({
opts,
})
},
// Users stuff
async fetchAdminUsers(opts) {
const adminData = await this.backendInteractor.adminListUsers({
opts,
})
adminData.users = await Promise.all(
adminData.users.map(
async (userAdminData) =>
await window.vuex.dispatch('updateUserAdminData', {
userAdminData,
}),
),
)
return adminData
},
async getUserData({ user }) {
const api = this.backendInteractor.adminGetUserData
const { screen_name } = user
const result = await api({ screen_name })
window.vuex.commit('updateUserAdminData', { user: result })
},
async deleteUsers({ users }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminDeleteAccounts
const resultUserIds = await api({ screen_names })
resultUserIds.forEach((userId) => {
window.vuex.dispatch(
'markStatusesAsDeleted',
(status) => userId === status.user.id,
)
// TODO when migrated to pinia, also remove user
})
return resultUserIds
},
resendConfirmationEmail({ users }) {
const screen_names = users.map((u) => u.screen_name)
return this.backendInteractor.adminResendConfirmationEmail({
screen_names,
})
},
requirePasswordChange({ users }) {
const screen_names = users.map((u) => u.screen_name)
return this.backendInteractor.adminRequirePasswordChange({
screen_names,
})
},
// Singular only!
disableMFA({ user }) {
return this.backendInteractor.adminDisableMFA(user)
},
async setUsersTags({ users, tags, value }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersTags
await api({
screen_names,
tags,
value,
})
users.forEach((user) => {
this.getUserData({ user })
})
},
async setUsersRight({ users, right, value }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersRight
await api({
screen_names,
right,
value,
})
users.forEach((user) => {
window.vuex.commit('updateRight', { user, right, value })
})
},
async setUsersActivationStatus({ users, value }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersActivationStatus
const resultUsers = await api({
screen_names,
value,
})
resultUsers.forEach((user) => {
window.vuex.commit('updateUserAdminData', { user })
})
},
async setUsersSuggestionStatus({ users, value }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersSuggestionStatus
const resultUsers = await api({
screen_names,
value,
})
resultUsers.forEach((user) => {
window.vuex.commit('updateUserAdminData', { user })
})
},
async setUsersConfirmationStatus({ users }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersConfirmationStatus
await api({ screen_names })
users.forEach((user) => {
this.getUserData({ user })
})
},
async setUsersApprovalStatus({ users }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersApprovalStatus
const resultUsers = await api({
screen_names,
})
resultUsers.forEach((user) => {
window.vuex.commit('updateUserAdminData', { user })
})
},
},
})