File size: 3,208 Bytes
064bfd6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | import axios from 'axios'
import { getOauthConfig } from '../../constants/oauth.js'
import { getOAuthHeaders, prepareApiRequest } from '../../utils/teleport/api.js'
export type AdminRequestType = 'limit_increase' | 'seat_upgrade'
export type AdminRequestStatus = 'pending' | 'approved' | 'dismissed'
export type AdminRequestSeatUpgradeDetails = {
message?: string | null
current_seat_tier?: string | null
}
export type AdminRequestCreateParams =
| {
request_type: 'limit_increase'
details: null
}
| {
request_type: 'seat_upgrade'
details: AdminRequestSeatUpgradeDetails
}
export type AdminRequest = {
uuid: string
status: AdminRequestStatus
requester_uuid?: string | null
created_at: string
} & (
| {
request_type: 'limit_increase'
details: null
}
| {
request_type: 'seat_upgrade'
details: AdminRequestSeatUpgradeDetails
}
)
/**
* Create an admin request (limit increase or seat upgrade).
*
* For Team/Enterprise users who don't have billing/admin permissions,
* this creates a request that their admin can act on.
*
* If a pending request of the same type already exists for this user,
* returns the existing request instead of creating a new one.
*/
export async function createAdminRequest(
params: AdminRequestCreateParams,
): Promise<AdminRequest> {
const { accessToken, orgUUID } = await prepareApiRequest()
const headers = {
...getOAuthHeaders(accessToken),
'x-organization-uuid': orgUUID,
}
const url = `${getOauthConfig().BASE_API_URL}/api/oauth/organizations/${orgUUID}/admin_requests`
const response = await axios.post<AdminRequest>(url, params, { headers })
return response.data
}
/**
* Get pending admin request of a specific type for the current user.
*
* Returns the pending request if one exists, otherwise null.
*/
export async function getMyAdminRequests(
requestType: AdminRequestType,
statuses: AdminRequestStatus[],
): Promise<AdminRequest[] | null> {
const { accessToken, orgUUID } = await prepareApiRequest()
const headers = {
...getOAuthHeaders(accessToken),
'x-organization-uuid': orgUUID,
}
let url = `${getOauthConfig().BASE_API_URL}/api/oauth/organizations/${orgUUID}/admin_requests/me?request_type=${requestType}`
for (const status of statuses) {
url += `&statuses=${status}`
}
const response = await axios.get<AdminRequest[] | null>(url, {
headers,
})
return response.data
}
type AdminRequestEligibilityResponse = {
request_type: AdminRequestType
is_allowed: boolean
}
/**
* Check if a specific admin request type is allowed for this org.
*/
export async function checkAdminRequestEligibility(
requestType: AdminRequestType,
): Promise<AdminRequestEligibilityResponse | null> {
const { accessToken, orgUUID } = await prepareApiRequest()
const headers = {
...getOAuthHeaders(accessToken),
'x-organization-uuid': orgUUID,
}
const url = `${getOauthConfig().BASE_API_URL}/api/oauth/organizations/${orgUUID}/admin_requests/eligibility?request_type=${requestType}`
const response = await axios.get<AdminRequestEligibilityResponse>(url, {
headers,
})
return response.data
}
|