breakhours-transform/api/shifts.js
2024-10-03 13:55:18 +02:00

111 lines
3.4 KiB
JavaScript

import { login } from './auth.js'
import { convertToAmsterdamTime } from "./utils.js";
export const getShifts = async (req, res) => {
const apiKey = req.body.apiKey;
// const apiProdUrl = 'https://api.fleks.works/v1/shifts/?limit=100000&page=1&isArchived=false&is_approved=false&is_exported=false&is_invoiced=false&is_paid_out=true&noShiftComments=true';
const apiProdUrl = 'https://api.fleks.works/v1/shifts/?limit=100000&page=1&isArchived=false&is_approved=false&noShiftComments=true';
try {
const response = await fetch(apiProdUrl, {
headers: {
'x-api-key': apiKey
}
});
const data = await response.json();
const shifts = data.results.map(shift => {
const startDate = new Date(shift.start_date);
const endDate = new Date(shift.end_date);
const startAmsterdamTime = convertToAmsterdamTime(startDate);
const endAmsterdamTime = convertToAmsterdamTime(endDate);
return {
...shift,
start_time: startAmsterdamTime,
end_time: endAmsterdamTime
};
});
res.json({ ...data, results: shifts });
} catch (error) {
console.log(error)
res.status(500).json({ error: 'Error fetching data' });
}
}
export const updateShifts = async (req, res) => {
const { config, shifts } = req.body; // Expected type = { config , shifts }
if (!Array.isArray(shifts)) {
console.error('Request body should be an array of updates');
return res.status(400).json({ error: 'Request body should be an array of updates' });
}
const results = {
success: [],
failed: []
};
const getToken = async () => {
return await login(config?.userName, config?.passWord);
}
let token = await getToken();
if (!token) {
const error = `token not obtained`;
console.log(error);
return res.status(403).send({ error });
}
const updateShift = async (update) => {
const { uuid, break_hours } = update;
const apiProdUrl = `https://backend.fleks.works/api/jobs/workflow-fields/${uuid}/`;
try {
const response = await fetch(apiProdUrl, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `JWT ${token}`
},
body: JSON.stringify({ break_hours })
});
const data = await response.json();
if (response.ok) {
console.log(`Successfully updated break hours for UUID: ${uuid}`);
results.success.push({ uuid, message: data.message });
} else {
if (response.status === 401 || response.status === 403) {
console.log(`Token invalid. Reattempting login for UUID: ${uuid}`);
token = await getToken();
if (token) {
return updateShift(update);
} else {
console.error(`Failed to update break hours for UUID: ${uuid}`, data);
results.failed.push({ uuid, error: 'Failed to reauthenticate and obtain new token' });
}
} else {
console.error(`Failed to update break hours for UUID: ${uuid}`, data);
results.failed.push({ uuid, error: data.message || data });
}
}
} catch (error) {
console.error(`Error updating break hours for UUID: ${uuid}`, error);
results.failed.push({ uuid, error: error.message });
}
}
for (const update of shifts) {
await updateShift(update);
}
console.log(`Finished processing updates. Success: ${results.success.length}, Failed: ${results.failed.length}`);
res.json(results);
}