some initial API refactoring

This commit is contained in:
Henry Jameson 2026-06-13 03:10:00 +03:00
commit 4a59c42395
20 changed files with 1368 additions and 1567 deletions

View file

@ -1,6 +1,26 @@
import { cloneDeep, differenceWith, flatten, get, isEqual, set } from 'lodash'
import { defineStore } from 'pinia'
import { useCredentialsStore } from 'src/stores/credentials.js'
import {
changeStatusScope,
deleteAccounts,
disableMFA,
getAvailableFrontends,
getInstanceDBConfig,
getUserData,
listStatuses,
listUsers,
requirePasswordChange,
resendConfirmationEmail,
setUsersActivationStatus,
setUsersApprovalStatus,
setUsersConfirmationStatus,
setUsersRight,
setUsersSuggestionStatus,
setUsersTags,
} from 'src/services/api/admin.js'
import { parseStatus } from 'src/services/entity_normalizer/entity_normalizer.service.js'
export const defaultState = {
@ -21,7 +41,6 @@ export const newUserFlags = {
export const useAdminSettingsStore = defineStore('adminSettings', {
state: () => ({
...cloneDeep(defaultState),
backendInteractor: window.vuex.state.api.backendInteractor,
}),
actions: {
// Configuration Stuff
@ -54,7 +73,9 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
},
loadAdminStuff() {
this.backendInteractor.fetchInstanceDBConfig().then((backendDbConfig) => {
getInstanceDBConfig({
credentials: useCredentialsStore().current,
}).then((backendDbConfig) => {
if (backendDbConfig.error) {
if (backendDbConfig.error.status === 400) {
backendDbConfig.error.json().then((errorJson) => {
@ -68,11 +89,9 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
}
})
if (this.descriptions === null) {
this.backendInteractor
.fetchInstanceConfigDescriptions()
.then((backendDescriptions) =>
this.setInstanceAdminDescriptions({ backendDescriptions }),
)
fetchInstanceConfigDescriptions().then((backendDescriptions) =>
this.setInstanceAdminDescriptions({ backendDescriptions }),
)
}
},
setInstanceAdminSettings({ backendDbConfig }) {
@ -203,15 +222,12 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
}
})
window.vuex.state.api.backendInteractor
.pushInstanceDBConfig({
payload: {
configs: changed,
},
})
.then(() =>
window.vuex.state.api.backendInteractor.fetchInstanceDBConfig(),
)
pushInstanceDBConfig({
payload: {
configs: changed,
},
})
.then(() => fetchInstanceDBConfig())
.then((backendDbConfig) =>
this.setInstanceAdminSettings({ backendDbConfig }),
)
@ -234,21 +250,18 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
}
}
window.vuex.state.api.backendInteractor
.pushInstanceDBConfig({
payload: {
configs: [
{
group,
key,
value: convert(clone),
},
],
},
})
.then(() =>
window.vuex.state.api.backendInteractor.fetchInstanceDBConfig(),
)
pushInstanceDBConfig({
payload: {
configs: [
{
group,
key,
value: convert(clone),
},
],
},
})
.then(() => fetchInstanceDBConfig())
.then((backendDbConfig) =>
this.setInstanceAdminSettings({ backendDbConfig }),
)
@ -260,22 +273,19 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
this.modifiedPaths.delete(path)
return window.vuex.state.api.backendInteractor
.pushInstanceDBConfig({
payload: {
configs: [
{
group,
key,
delete: true,
subkeys: [subkey],
},
],
},
})
.then(() =>
window.vuex.state.api.backendInteractor.fetchInstanceDBConfig(),
)
return pushInstanceDBConfig({
payload: {
configs: [
{
group,
key,
delete: true,
subkeys: [subkey],
},
],
},
})
.then(() => fetchInstanceDBConfig())
.then((backendDbConfig) =>
this.setInstanceAdminSettings({ backendDbConfig }),
)
@ -283,9 +293,9 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
// Frontends Stuff
loadFrontendsStuff() {
this.backendInteractor
.fetchAvailableFrontends()
.then((frontends) => this.setAvailableFrontends({ frontends }))
getAvailableFrontends({
credentials: useCredentialsStore().current,
}).then((frontends) => this.setAvailableFrontends({ frontends }))
},
setAvailableFrontends({ frontends }) {
@ -302,10 +312,10 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
// Statuses stuff
async fetchStatuses(opts) {
const { total, activities } =
await this.backendInteractor.adminListStatuses({
opts,
})
const { total, activities } = await listStatuses({
credentials: useCredentialsStore().current,
opts,
})
const statuses = activities.map(parseStatus)
@ -317,7 +327,8 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
}
},
async changeStatusScope(opts) {
const raw = await this.backendInteractor.adminChangeStatusScope({
const raw = await changeStatusScope({
credentials: useCredentialsStore().current,
opts,
})
const status = parseStatus(raw)
@ -327,7 +338,9 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
// Users stuff
async fetchUsers(opts) {
const { users, count } = await this.backendInteractor.adminListUsers({
const { users, count } = await listUsers({
credentials: useCredentialsStore().current,
opts,
})
@ -344,17 +357,23 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
}
},
async getUserData({ user }) {
const api = this.backendInteractor.adminGetUserData
const api = getUserData
const { screen_name } = user
const result = await api({ screen_name })
const result = await api({
credentials: useCredentialsStore().current,
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 api = deleteAccounts
const resultUserIds = await api({ screen_names })
const resultUserIds = await api({
credentials: useCredentialsStore().current,
screen_names,
})
resultUserIds.forEach((userId) => {
window.vuex.dispatch(
@ -369,28 +388,34 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
resendConfirmationEmail({ users }) {
const screen_names = users.map((u) => u.screen_name)
return this.backendInteractor.adminResendConfirmationEmail({
screen_names,
return resendConfirmationEmail({
credentials: useCredentialsStore().current,
screen_names,
})
},
requirePasswordChange({ users }) {
const screen_names = users.map((u) => u.screen_name)
return this.backendInteractor.adminRequirePasswordChange({
screen_names,
return requirePasswordChange({
credentials: useCredentialsStore().current,
screen_names,
})
},
// Singular only!
disableMFA({ user }) {
const { screen_name } = user
return this.backendInteractor.adminDisableMFA({ screen_name })
return disableMFA({
credentials: useCredentialsStore().current,
screen_name,
})
},
async setUsersTags({ users, tags, value }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersTags
const api = setUsersTags
await api({
credentials: useCredentialsStore().current,
screen_names,
tags,
value,
@ -402,9 +427,10 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
},
async setUsersRight({ users, right, value }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersRight
const api = setUsersRight
await api({
credentials: useCredentialsStore().current,
screen_names,
right,
value,
@ -416,9 +442,10 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
},
async setUsersActivationStatus({ users, value }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersActivationStatus
const api = setUsersActivationStatus
const resultUsers = await api({
credentials: useCredentialsStore().current,
screen_names,
value,
})
@ -429,9 +456,10 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
},
async setUsersSuggestionStatus({ users, value }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersSuggestionStatus
const api = setUsersSuggestionStatus
const resultUsers = await api({
credentials: useCredentialsStore().current,
screen_names,
value,
})
@ -442,9 +470,12 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
},
async setUsersConfirmationStatus({ users }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersConfirmationStatus
const api = setUsersConfirmationStatus
await api({ screen_names })
await api({
credentials: useCredentialsStore().current,
screen_names,
})
users.forEach((user) => {
this.getUserData({ user })
@ -452,9 +483,10 @@ export const useAdminSettingsStore = defineStore('adminSettings', {
},
async setUsersApprovalStatus({ users }) {
const screen_names = users.map((u) => u.screen_name)
const api = this.backendInteractor.adminSetUsersApprovalStatus
const api = setUsersApprovalStatus
const resultUsers = await api({
credentials: useCredentialsStore().current,
screen_names,
})

View file

@ -1,5 +1,18 @@
import { defineStore } from 'pinia'
import { useCredentialsStore } from 'src/stores/credentials.js'
import {
getAnnouncements as adminGetAnnouncements,
deleteAnnouncement,
editAnnouncement,
postAnnouncement,
} from 'src/services/api/admin.js'
import {
dismissAnnouncement,
getAnnouncements,
} from 'src/services/api/api.service.js'
const FETCH_ANNOUNCEMENT_INTERVAL_MS = 1000 * 60 * 5
export const useAnnouncementsStore = defineStore('announcements', {
@ -31,15 +44,19 @@ export const useAnnouncementsStore = defineStore('announcements', {
currentUser &&
currentUser.privileges.has('announcements_manage_announcements')
const getAnnouncements = async () => {
const fetchAnnouncements = async () => {
if (!isAdmin) {
return window.vuex.state.api.backendInteractor.fetchAnnouncements()
return fetchAnnouncements({
credentials: useCredentialsStore().current,
})
}
const all =
await window.vuex.state.api.backendInteractor.adminFetchAnnouncements()
const visible =
await window.vuex.state.api.backendInteractor.fetchAnnouncements()
const all = await adminGetAnnouncements({
credentials: useCredentialsStore().current,
})
const visible = await getAnnouncements({
credentials: useCredentialsStore().current,
})
const visibleObject = visible.reduce((a, c) => {
a[c.id] = c
return a
@ -59,7 +76,7 @@ export const useAnnouncementsStore = defineStore('announcements', {
return all
}
return getAnnouncements()
return fetchAnnouncements()
.then((announcements) => {
this.announcements = announcements
})
@ -74,17 +91,18 @@ export const useAnnouncementsStore = defineStore('announcements', {
})
},
markAnnouncementAsRead(id) {
return window.vuex.state.api.backendInteractor
.dismissAnnouncement({ id })
.then(() => {
const index = this.announcements.findIndex((a) => a.id === id)
return dismissAnnouncement({
id,
credentials: useCredentialsStore().current,
}).then(() => {
const index = this.announcements.findIndex((a) => a.id === id)
if (index < 0) {
return
}
if (index < 0) {
return
}
this.announcements[index].read = true
})
this.announcements[index].read = true
})
},
startFetchingAnnouncements() {
if (this.fetchAnnouncementsTimer) {
@ -105,25 +123,35 @@ export const useAnnouncementsStore = defineStore('announcements', {
clearInterval(interval)
},
postAnnouncement({ content, startsAt, endsAt, allDay }) {
return window.vuex.state.api.backendInteractor
.postAnnouncement({ content, startsAt, endsAt, allDay })
.then(() => {
return this.fetchAnnouncements()
})
return postAnnouncement({
credentials: useCredentialsStore().current,
content,
startsAt,
endsAt,
allDay,
}).then(() => {
return this.fetchAnnouncements()
})
},
editAnnouncement({ id, content, startsAt, endsAt, allDay }) {
return window.vuex.state.api.backendInteractor
.editAnnouncement({ id, content, startsAt, endsAt, allDay })
.then(() => {
return this.fetchAnnouncements()
})
return editAnnouncement({
id,
content,
startsAt,
endsAt,
allDay,
credentials: useCredentialsStore().current,
}).then(() => {
return this.fetchAnnouncements()
})
},
deleteAnnouncement(id) {
return window.vuex.state.api.backendInteractor
.deleteAnnouncement({ id })
.then(() => {
return this.fetchAnnouncements()
})
return deleteAnnouncement({
id,
credentials: useCredentialsStore().current,
}).then(() => {
return this.fetchAnnouncements()
})
},
},
})

View file

@ -1,6 +1,14 @@
import { find, remove } from 'lodash'
import { defineStore } from 'pinia'
import { useCredentialsStore } from 'src/stores/credentials.js'
import {
createBookmarkFolder,
deleteBookmarkFolder,
updateBookmarkFolder,
} from 'src/services/api/api.service.js'
export const useBookmarkFoldersStore = defineStore('bookmarkFolders', {
state: () => ({
allFolders: [],
@ -30,23 +38,31 @@ export const useBookmarkFoldersStore = defineStore('bookmarkFolders', {
}
},
createBookmarkFolder({ name, emoji }) {
return window.vuex.state.api.backendInteractor
.createBookmarkFolder({ name, emoji })
.then((folder) => {
this.setBookmarkFolder(folder)
return folder
})
return createBookmarkFolder({
name,
emoji,
credentials: useCredentialsStore().current,
}).then((folder) => {
this.setBookmarkFolder(folder)
return folder
})
},
updateBookmarkFolder({ folderId, name, emoji }) {
return window.vuex.state.api.backendInteractor
.updateBookmarkFolder({ folderId, name, emoji })
.then((folder) => {
this.setBookmarkFolder(folder)
return folder
})
return updateBookmarkFolder({
credentials: useCredentialsStore().current,
folderId,
name,
emoji,
}).then((folder) => {
this.setBookmarkFolder(folder)
return folder
})
},
deleteBookmarkFolder({ folderId }) {
window.vuex.state.api.backendInteractor.deleteBookmarkFolder({ folderId })
deleteBookmarkFolder({
folderId,
credentials: useCredentialsStore().current,
})
remove(this.allFolders, (folder) => folder.id === folderId)
},
},

19
src/stores/credentials.js Normal file
View file

@ -0,0 +1,19 @@
import { defineStore } from 'pinia'
const defaultState = {
credentials: null,
}
export const useCredentialsStore = defineStore('credentials', {
state: () => ({ ...defaultState }),
actions: {
setCredentials(credentials) {
this.credentials = credentials
},
},
getters: {
current() {
return window.vuex.state.users.currentUser.credentials
},
},
})

View file

@ -11,7 +11,7 @@ import {
LOCAL_DEFAULT_CONFIG_DEFINITIONS,
validateSetting,
} from '../modules/default_config_state.js'
import apiService from '../services/api/api.service.js'
import { fetchKnownDomains } from '../services/api/api.service.js'
import { useInterfaceStore } from 'src/stores/interface.js'
@ -210,7 +210,7 @@ export const useInstanceStore = defineStore('instance', {
},
async getKnownDomains() {
try {
this.knownDomains = await apiService.fetchKnownDomains({
this.knownDomains = await fetchKnownDomains({
credentials: window.vuex.state.users.currentUser.credentials,
})
} catch (e) {

View file

@ -1,8 +1,11 @@
import { filter } from 'lodash'
import { defineStore } from 'pinia'
import { useCredentialsStore } from 'src/stores/credentials.js'
import { useInterfaceStore } from 'src/stores/interface.js'
import { setReportState } from 'src/services/api/admin.js'
export const useReportsStore = defineStore('reports', {
state: () => ({
reportModal: {
@ -40,18 +43,21 @@ export const useReportsStore = defineStore('reports', {
setReportState({ id, state }) {
const oldState = this.reports[id].state
this.reports[id].state = state
window.vuex.state.api.backendInteractor
.setReportState({ id, state })
.catch((e) => {
console.error('Failed to set report state', e)
useInterfaceStore().pushGlobalNotice({
level: 'error',
messageKey: 'general.generic_error_message',
messageArgs: [e.message],
timeout: 5000,
})
this.reports[id].state = oldState
setReportState({
id,
state,
credentials: useCredentialsStore().current,
}).catch((e) => {
console.error('Failed to set report state', e)
useInterfaceStore().pushGlobalNotice({
level: 'error',
messageKey: 'general.generic_error_message',
messageArgs: [e.message],
timeout: 5000,
})
this.reports[id].state = oldState
})
},
addReport(report) {
this.reports[report.id] = report