Files
RenewCMS/web/src/composables/useUsers.ts
T

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,
}
}