Files
pleno-vue/src/components/session/authenticatedRequest.vue
T
Jeppe Bundgaard ea8db593c5 Add release headers service, runtime-aware API header handling, and i18n updates for release configuration
- Implement `releaseHeaders.js` to manage release-related HTTP headers.
- Update requests to include runtime-based release headers.
- Extend i18n phrases across multiple locales for release runtime and configuration labels.
- Enhance unit tests for header building and API availability error handling.
2026-05-20 17:52:54 +02:00

120 lines
3.1 KiB
Vue

<script>
import axios from 'axios'
import { enqueueRequest } from "@/services/requestQueue.js";
import { buildCurrentReleaseHeaders, resolveReleaseApiUrl } from "@/services/releaseTimeline.js";
/**
* Get the selected customer number for X-Customer-Number header (used by subusers)
* @returns {number|null}
*/
const getSelectedCustomerNumber = () => {
const stored = localStorage.getItem('selected_customer_number');
return stored ? parseInt(stored) : null;
};
export const authenticatedRequest = (url, method, data, catchCallable = null, thenCallable = null) => {
const token = localStorage.getItem('token');
if (!token) {
//throw new Error('No token was found, unable to make authenticated request');
}
// Build headers
const headers = {
...buildCurrentReleaseHeaders(),
};
if (token && token.length > 0) {
headers.Authorization = `Bearer ${token}`;
}
// Add X-Customer-Number header if subuser has selected a grant
const isSubuser = localStorage.getItem('is_subuser') === 'true';
const selectedCustomerNumber = getSelectedCustomerNumber();
if (isSubuser && selectedCustomerNumber) {
headers['X-Customer-Number'] = selectedCustomerNumber;
}
const requestUrl = resolveReleaseApiUrl(url);
return enqueueRequest(
() => axios({
method,
url: requestUrl,
...(method === 'GET' ? { params: data } : { data }),
__skipRequestQueue: true,
headers
}),
{
method,
url: requestUrl,
requestData: {
params: method === 'GET' ? data : null,
data: method === 'GET' ? null : data,
headers,
}
}
)
.catch((error) => {
if (catchCallable) {
// Call the catch callable
catchCallable(error);
}
throw error;
})
.then((response) => {
if (thenCallable) {
// Call the then callable
thenCallable(response);
}
return response;
});
};
export const unauthenticatedRequest = (url, method, data, catchCallable = null, thenCallable = null) => {
return axios({
method,
url: resolveReleaseApiUrl(url),
data,
headers: buildCurrentReleaseHeaders(),
}).catch((error) => {
if (catchCallable) {
// Call the catch callable
catchCallable(error);
}
throw error;
}).then((response) => {
if (thenCallable) {
// Call the then callable
thenCallable(response);
}
return response;
});
};
export const paginatedGetRequest = (url, currentPage, itemsPerPage) => {
const token = localStorage.getItem('token');
if (!token) {
return null;
}
// Build headers
const headers = {
...buildCurrentReleaseHeaders(),
Authorization: `Bearer ${token}`
};
// Add X-Customer-Number header if subuser has selected a grant
const isSubuser = localStorage.getItem('is_subuser') === 'true';
const selectedCustomerNumber = getSelectedCustomerNumber();
if (isSubuser && selectedCustomerNumber) {
headers['X-Customer-Number'] = selectedCustomerNumber;
}
return axios.get(resolveReleaseApiUrl(url), {
params: {
page: currentPage,
limit: itemsPerPage
},
headers
});
};
</script>