Skip to main content

API - radio specifics

API for radio are built as described for web part in API This page only describes the Radio specifics.

Structure

Radio API files are organized in the following way:

pages/api/[name of the Family]/[name of the function]/index.ts

An API is mainly workflow-dedicated, but can be common to 2 processes. As examples:

  • ValidatePalletMoveForm calls validatePalletMove API that processes several mutations:

    pages/api/stock-management/validatePalletMove/index.ts
    import { gql, GraphQLClient } from 'graphql-request';
    import type { NextApiRequest, NextApiResponse } from 'next';

    const parseCookie = (str: string) =>
    str
    .split(';')
    .map((v) => v.split('='))
    .reduce((acc: any, v) => {
    acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim());
    return acc;
    }, {});

    export default async (req: NextApiRequest, res: NextApiResponse) => {
    const cookie = parseCookie(req.headers.cookie ?? '');
    const token = cookie['token'];

    const requestHeader = {
    authorization: `Bearer ${token}`
    };

    const graphqlRequestClient = new GraphQLClient(
    process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT as string,
    {
    headers: requestHeader
    }
    );

    // retrieve information from front
    const { handlingUnit, finalLocation } = req.body;

    const movementCodes = {
    [...]
    };

    //update hu section
    const updateHUMutation = gql`
    mutation updateHandlingUnit($id: String!, $input: UpdateHandlingUnitInput!) {
    updateHandlingUnit(id: $id, input: $input) {
    id
    locationId
    }
    }
    ';

    const updateHUVariables = {
    id: handlingUnit.id,
    input: { locationId: handlingUnit.locationId }
    };

    const updateHuResult = await graphqlRequestClient.request(
    updateHUMutation,
    updateHUVariables,
    requestHeader
    );
    //end handling unit update section

    //movements creation section
    const createMovement = gql`
    mutation createMovement($input: CreateMovementInput!) {
    createMovement(input: $input) {
    id
    }
    }
    `;

    let movementResults: any = [];
    handlingUnit.handlingUnitContent.forEach(async (handlingUnitContent: any) => {
    const movementVariables = {
    input: {
    originalLocationId: handlingUnit.locationId,
    originalHandlingUnitId: handlingUnit.id,
    originalContentId: handlingUnitContent.id,
    articleId: handlingUnitContent.articleId,
    stockOwnerId: handlingUnit.stockOwnerId,
    ...movementCodes,
    finalLocationId: finalLocation.id,
    finalContentId: handlingUnitContent.id,
    finalHandlingUnitId: handlingUnit.id
    }
    };

    const resultMovementLine = await graphqlRequestClient.request(
    createMovement,
    movementVariables,
    requestHeader
    );
    movementResults.push(resultMovementLine);
    });
    //end movement creation section

    //merge results
    res.status(200).json({
    response: {
    updatedHU: updateHuResult,
    movement: movementResults
    }
    });

    };
  • CheckFinalLocationPallet and CheckFinalLocationQuantity both call checkFinalLocation API that has the role of directing to the relevant back-end query

    pages/api/stock-management/checkFinalLocation/index.ts
    import { gql, GraphQLClient } from "graphql-request";
    import type { NextApiRequest, NextApiResponse } from "next";

    const parseCookie = (str: string) =>
    str
    .split(';')
    .map((v) => v.split('='))
    .reduce((acc: any, v) => {
    acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim());
    return acc;
    }, {});

    export default async (req: NextApiRequest, res: NextApiResponse) => {
    const cookie = parseCookie(req.headers.cookie ?? '');
    const token = cookie['token'];

    const requestHeader = {
    authorization: `Bearer ${token}`
    };

    const graphqlRequestClient = new GraphQLClient(
    process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT as string,
    {
    headers: requestHeader
    }
    );

    const checkFinalLocationVariables = {
    originLocationId: req.body.originLocationId,
    destinationLocationId: req.body.destinationLocationId,
    articleId: req.body.articleId
    };

    let checkFinalLocation: any | null;
    if (req.body.movementType == 'quantityMvt') {
    checkFinalLocation = gql`
    query checkFinalLocationQuantity(
    $originLocationId: String!
    $destinationLocationId: String!
    $articleId: String
    ) {
    checkFinalLocationQuantity(
    originLocationId: $originLocationId
    destinationLocationId: $destinationLocationId
    articleId: $articleId
    ) {
    isCorrect
    locationComparison
    destinationContentId
    destinationContentQuantity
    destinationHuId
    }
    }
    `;
    } else if (req.body.movementType == 'palletMvt') {
    checkFinalLocation = gql`
    query checkFinalLocationPallet(
    $originLocationId: String!
    $destinationLocationId: String!
    ) {
    checkFinalLocationPallet(
    originLocationId: $originLocationId
    destinationLocationId: $destinationLocationId
    ) {
    isCorrect
    locationComparison
    }
    }
    `;
    }

    const result = await graphqlRequestClient
    .request(checkFinalLocation, checkFinalLocationVariables, requestHeader)
    .catch((error: any) => {
    if (error.response.errors[0].extensions) {
    res.status(500).json({
    error: {
    is_error: error.response.errors[0].extensions.is_error,
    code: error.response.errors[0].extensions.code,
    message: error.response.errors[0].message,
    variables: error.response.errors[0].extensions.variables,
    exception: error.response.errors[0].extensions.exception
    }
    });
    } else {
    res.status(500).json({ error });
    }
    });

    if (result) {
    res.status(200).json({ response: result });
    }