Refactor Dewar service methods and improve field handling

Updated Dewar API methods to use protected endpoints for enhanced security and consistency. Added `pgroups` handling in various frontend components and modified the LogisticsView contact field for clarity. Simplified backend router imports for better readability.
This commit is contained in:
GotthardG
2025-01-30 13:39:49 +01:00
parent 44582cf38e
commit c2215860bf
20 changed files with 304 additions and 262 deletions

View File

@ -117,7 +117,7 @@ const DewarDetails: React.FC<DewarDetailsProps> = ({
useEffect(() => {
const fetchDewarTypes = async () => {
try {
const response = await DewarsService.getDewarTypesDewarsDewarTypesGet();
const response = await DewarsService.getDewarTypesProtectedDewarsDewarTypesGet();
setKnownDewarTypes(response ?? []);
} catch (error) {
setFeedbackMessage('Failed to fetch dewar types.');
@ -132,7 +132,7 @@ const DewarDetails: React.FC<DewarDetailsProps> = ({
useEffect(() => {
const fetchSerialNumbers = async () => {
try {
const response = await DewarsService.getAllSerialNumbersDewarsDewarSerialNumbersGet();
const response = await DewarsService.getAllSerialNumbersProtectedDewarsDewarSerialNumbersGet();
setKnownSerialNumbers(response ?? []);
} catch (error) {
setFeedbackMessage('Failed to fetch serial numbers.');
@ -248,8 +248,8 @@ const DewarDetails: React.FC<DewarDetailsProps> = ({
const handleSaveNewDewarTypeAndSerialNumber = async () => {
if (newDewarType) {
try {
const typeResponse = await DewarsService.createDewarTypeDewarsDewarTypesPost({ dewar_type: newDewarType });
const serialResponse = await DewarsService.createDewarSerialNumberDewarsDewarSerialNumbersPost({
const typeResponse = await DewarsService.createDewarTypeProtectedDewarsDewarTypesPost({ dewar_type: newDewarType });
const serialResponse = await DewarsService.createDewarSerialNumberProtectedDewarsDewarSerialNumbersPost({
serial_number: newDewarSerialNumber,
dewar_type_id: typeResponse.id,
});
@ -266,7 +266,7 @@ const DewarDetails: React.FC<DewarDetailsProps> = ({
}
} else if (newDewarSerialNumber && selectedDewarType) {
try {
const response = await DewarsService.createDewarSerialNumberDewarsDewarSerialNumbersPost({
const response = await DewarsService.createDewarSerialNumberProtectedDewarsDewarSerialNumbersPost({
serial_number: newDewarSerialNumber,
dewar_type_id: parseInt(selectedDewarType, 10),
});
@ -371,6 +371,7 @@ const DewarDetails: React.FC<DewarDetailsProps> = ({
try {
const payload = {
pgroups: activePgroup,
dewar_name: dewar.dewar_name,
dewar_type_id: parseInt(selectedDewarType, 10),
dewar_serial_number_id: parseInt(selectedSerialNumber, 10),
@ -378,15 +379,11 @@ const DewarDetails: React.FC<DewarDetailsProps> = ({
number_of_pucks: dewar.number_of_pucks,
number_of_samples: dewar.number_of_samples,
status: dewar.status,
ready_date: formatDate(dewar.ready_date),
shipping_date: formatDate(dewar.shipping_date),
arrival_date: dewar.arrival_date,
returning_date: dewar.returning_date,
return_address_id: parseInt(selectedReturnAddress ?? '', 10),
contact_id: parseInt(selectedContact ?? '', 10),
};
await DewarsService.updateDewarDewarsDewarIdPut(dewarId, payload);
await DewarsService.updateDewarProtectedDewarsDewarIdPut(dewarId, payload);
setFeedbackMessage('Changes saved successfully.');
setChangesMade(false);
} catch (error) {
@ -408,7 +405,7 @@ const DewarDetails: React.FC<DewarDetailsProps> = ({
if (!dewar) return;
try {
const response = await DewarsService.generateDewarQrcodeDewarsDewarIdGenerateQrcodePost(dewar.id);
const response = await DewarsService.generateDewarQrcodeProtectedDewarsDewarIdGenerateQrcodePost(dewar.id);
const newQrCodeValue = response.unique_id;
setQrCodeValue(newQrCodeValue);
setIsQRCodeGenerated(true);
@ -426,7 +423,7 @@ const DewarDetails: React.FC<DewarDetailsProps> = ({
if (!dewar) return;
try {
const response = await DewarsService.downloadDewarLabelDewarsDewarIdDownloadLabelGet(dewar.id);
const response = await DewarsService.downloadDewarLabelProtectedDewarsDewarIdDownloadLabelGet(dewar.id);
// The response object might need parsing
const blob = new Blob([response as any], { type: 'application/pdf' });

View File

@ -19,7 +19,7 @@ const SampleSpreadsheet: React.FC<SampleSpreadsheetProps> = ({ dewarId }) => {
const fetchSamples = async () => {
try {
const response = await DewarsService.getDewarSamplesDewarsDewarsDewarIdSamplesGet(dewarId);
const response = await DewarsService.getDewarSamplesProtectedDewarsDewarsDewarIdSamplesGet(dewarId);
console.log("Response from backend:", response);
const dewarData = response; // Assume response is already in correct structure
@ -173,7 +173,7 @@ const SampleSpreadsheet: React.FC<SampleSpreadsheetProps> = ({ dewarId }) => {
);
// API call to persist changes
await DewarsService.updateSampleDewarsSamplesSampleIdPut(Number(id), updatedSample);
await DewarsService.updateSampleProtectedDewarsSamplesSampleIdPut(Number(id), updatedSample);
console.log(`Sample with ID ${id} successfully updated.`);
} catch (error) {
@ -237,7 +237,7 @@ const SampleSpreadsheet: React.FC<SampleSpreadsheetProps> = ({ dewarId }) => {
);
// Send the payload to the backend
await DewarsService.updateSampleDewarsSamplesSampleIdPut(Number(newRow.id), payload);
await DewarsService.updateSampleProtectedDewarsSamplesSampleIdPut(Number(newRow.id), payload);
console.log(`Successfully updated sample with ID ${newRow.id}.`);
return payload; // Return the updated row

View File

@ -48,11 +48,6 @@ const ShipmentDetails: React.FC<ShipmentDetailsProps> = ({
tracking_number: '',
number_of_pucks: 0,
number_of_samples: 0,
status: 'In preparation',
ready_date: null,
shipping_date: null,
arrival_date: null,
returning_date: null,
contact_id: selectedShipment?.contact?.id,
return_address_id: selectedShipment?.return_address?.id,
};
@ -126,16 +121,18 @@ const ShipmentDetails: React.FC<ShipmentDetailsProps> = ({
const newDewarToPost: Dewar = {
...initialNewDewarState,
...newDewar,
pgroups:activePgroup,
dewar_name: newDewar.dewar_name.trim(),
contact_id: selectedShipment?.contact?.id,
return_address_id: selectedShipment?.return_address?.id
return_address_id: selectedShipment?.return_address?.id,
status: 'active',
} as Dewar;
if (!newDewarToPost.dewar_name || !newDewarToPost.status) {
throw new Error('Missing required fields');
}
const createdDewar = await DewarsService.createOrUpdateDewarDewarsPost(selectedShipment.id, newDewarToPost);
const createdDewar = await DewarsService.createOrUpdateDewarProtectedDewarsPost(selectedShipment.id, newDewarToPost);
if (createdDewar && selectedShipment) {
const updatedShipment = await ShipmentsService.addDewarToShipmentProtectedShipmentsShipmentIdAddDewarPost(selectedShipment.id, createdDewar.id);

View File

@ -197,6 +197,7 @@ const ShipmentPanel: React.FC<ShipmentPanelProps> = ({
);
})}
<UploadDialog
activePgroup={activePgroup}
open={uploadDialogOpen}
onClose={closeUploadDialog}
selectedShipment={selectedShipment}

View File

@ -31,6 +31,7 @@ const SpreadsheetTable = ({
fileBlob,
selectedShipment,
addinfo,
activePgroup,
}) => {
const [localErrors, setLocalErrors] = useState(errors || []);
const [editingCell, setEditingCell] = useState({});
@ -59,17 +60,14 @@ const SpreadsheetTable = ({
console.log("Addinfo:", addinfo);
}, [correctionMetadata, addinfo]);
const initialNewDewarState = {
pgroups: activePgroup,
number_of_pucks: 0,
number_of_samples: 0,
ready_date: null,
shipping_date: null,
arrival_date: null,
returning_date: null,
contact_id: selectedShipment?.contact?.id,
return_address_id: selectedShipment?.return_address?.id,
dewar_name: '',
tracking_number: 'UNKNOWN',
status: 'In preparation',
status: 'active',
pucks: [] // Ensure 'pucks' array exists
};
@ -242,7 +240,7 @@ const SpreadsheetTable = ({
try {
// Fetch dewars related to the current shipment via API
const shipDewars = await ShipmentsService.getDewarsByShipmentIdShipmentsShipmentIdDewarsGet(selectedShipment.id);
const shipDewars = await ShipmentsService.getDewarsByShipmentIdProtectedShipmentsShipmentIdDewarsGet(selectedShipment.id);
// Search for dewar by name within the shipment
const existingDewar = shipDewars.find((d) => d.dewar_name === dewarName);
@ -258,8 +256,8 @@ const SpreadsheetTable = ({
}
};
const createOrUpdateDewarsFromSheet = async (data, contactPerson, returnAddress) => {
if (!contact?.id || !returnAddress?.id) {
const createOrUpdateDewarsFromSheet = async (data, contact, address) => {
if (!contact?.id || !address?.id) {
console.error('contact_id or return_address_id is missing');
return null;
}
@ -287,9 +285,10 @@ const SpreadsheetTable = ({
// Initialize new dewar object
dewar = {
...initialNewDewarState,
pgroups: activePgroup,
dewar_name: dewarName,
contact_id: contactPerson.id,
return_address_id: returnAddress.id,
contact_id: contact.id,
return_address_id: address.id,
pucks: [],
};
dewars.set(dewarName, dewar);
@ -442,7 +441,7 @@ const SpreadsheetTable = ({
const { number_of_pucks, number_of_samples, ...payload } = dewar;
// Attempt to create or update a dewar
await DewarsService.createOrUpdateDewarDewarsPost(selectedShipment.id, payload);
await DewarsService.createOrUpdateDewarProtectedDewarsPost(selectedShipment.id, payload);
console.log(`Dewar "${dewar.dewar_name}" created/updated successfully.`);
} catch (error: any) {

View File

@ -12,12 +12,13 @@ import SpreadsheetTable from './SpreadsheetTable';
import Modal from './Modal';
interface UploadDialogProps {
activePgroup: string;
open: boolean;
onClose: () => void;
selectedShipment: any;
}
const UploadDialog: React.FC<UploadDialogProps> = ({ open, onClose, selectedShipment }) => {
const UploadDialog: React.FC<UploadDialogProps> = ({ open, onClose, selectedShipment, activePgroup }) => {
const [uploadError, setUploadError] = useState<string | null>(null);
const [fileSummary, setFileSummary] = useState<any>(null);
const [fileBlob, setFileBlob] = useState<Blob | null>(null);
@ -180,6 +181,7 @@ const UploadDialog: React.FC<UploadDialogProps> = ({ open, onClose, selectedShip
onCancel={handleCancel}
fileBlob={fileBlob}
selectedShipment={selectedShipment}
activePgroup={activePgroup}
addinfo={fileSummary.addinfo}
/>
</Modal>