99 lines
2.6 KiB
TypeScript
99 lines
2.6 KiB
TypeScript
import { useApi } from '@/composables/useApi'
|
|
import type { LinkableUser } from '@/lib/directoryTypes'
|
|
import type { RoleRef } from '@/lib/permissions'
|
|
import type { AcceptedUser, CreatedInvite, OwnershipTransfer, UserListItem } from '@/lib/users'
|
|
|
|
export type { AcceptedUser, CreatedInvite, OwnershipTransfer, UserListItem }
|
|
|
|
export const USER_SKELETON_ROWS = 5
|
|
|
|
export function userRowKey(kind: UserListItem['kind'], id: number) {
|
|
return `${kind}-${id}`
|
|
}
|
|
|
|
export function userDisplayName(item: UserListItem) {
|
|
return item.kind === 'user' ? item.display_name : ''
|
|
}
|
|
|
|
export function userRole(item: UserListItem): RoleRef | null {
|
|
return item.role ?? null
|
|
}
|
|
|
|
const JSON_HEADERS = { 'Content-Type': 'application/json' }
|
|
|
|
export function useUsers() {
|
|
const { request } = useApi()
|
|
|
|
function listUsers(): Promise<UserListItem[]> {
|
|
return request<UserListItem[]>('/v1/user/')
|
|
}
|
|
|
|
async function listLinkableUsers(
|
|
takenUserIds: ReadonlySet<number | null>,
|
|
): Promise<LinkableUser[]> {
|
|
const users = await listUsers()
|
|
return users.flatMap((user) =>
|
|
user.kind === 'user' && !takenUserIds.has(user.id)
|
|
? [
|
|
{
|
|
id: user.id,
|
|
label: user.display_name || user.username,
|
|
email: user.email,
|
|
},
|
|
]
|
|
: [],
|
|
)
|
|
}
|
|
|
|
function inviteUser(email: string, roleId?: number): Promise<CreatedInvite> {
|
|
return request<CreatedInvite>('/v1/user/invite', {
|
|
method: 'POST',
|
|
headers: JSON_HEADERS,
|
|
body: JSON.stringify(roleId === undefined ? { email } : { email, role_id: roleId }),
|
|
})
|
|
}
|
|
|
|
function changeUserRole(id: number, roleId: number): Promise<AcceptedUser> {
|
|
return request<AcceptedUser>(`/v1/user/${id}/role`, {
|
|
method: 'PUT',
|
|
headers: JSON_HEADERS,
|
|
body: JSON.stringify({ role_id: roleId }),
|
|
})
|
|
}
|
|
|
|
function transferOwnership(userId: number, confirmEmail: string): Promise<OwnershipTransfer> {
|
|
return request<OwnershipTransfer>('/v1/site/transfer-ownership', {
|
|
method: 'POST',
|
|
headers: JSON_HEADERS,
|
|
body: JSON.stringify({ user_id: userId, confirm_email: confirmEmail }),
|
|
})
|
|
}
|
|
|
|
function removeUser(id: number, expectedRoleId: number): Promise<void> {
|
|
return request<void>(`/v1/user/${id}?expected_role_id=${expectedRoleId}`, {
|
|
method: 'DELETE',
|
|
})
|
|
}
|
|
|
|
function cancelInvite(id: number): Promise<void> {
|
|
return request<void>(`/v1/user/invite/${id}`, { method: 'DELETE' })
|
|
}
|
|
|
|
function renewInvite(id: number): Promise<CreatedInvite> {
|
|
return request<CreatedInvite>(`/v1/user/invite/${id}/renew`, {
|
|
method: 'POST',
|
|
})
|
|
}
|
|
|
|
return {
|
|
listUsers,
|
|
listLinkableUsers,
|
|
inviteUser,
|
|
changeUserRole,
|
|
transferOwnership,
|
|
removeUser,
|
|
cancelInvite,
|
|
renewInvite,
|
|
}
|
|
}
|