All files / app/assets/javascripts/releases util.js

100% Statements 37/37
100% Branches 10/10
100% Functions 14/14
100% Lines 30/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138        13x   13x 217x                   217x         13x 217x 217x 162x     217x 217x 576x           217x                 217x 90x     217x             13x 217x 55x     162x                 217x   217x 290x                                       217x                                       13x 93x   93x       93x                       13x 76x   76x    
import { pick } from 'lodash';
import createGqClient, { fetchPolicies } from '~/lib/graphql';
import { truncateSha } from '~/lib/utils/text_utility';
 
export const gqClient = createGqClient({}, { fetchPolicy: fetchPolicies.NO_CACHE });
 
const convertScalarProperties = (graphQLRelease) =>
  pick(graphQLRelease, [
    'name',
    'tagName',
    'tagPath',
    'description',
    'descriptionHtml',
    'upcomingRelease',
    'historicalRelease',
  ]);
 
const convertDateProperties = ({ createdAt, releasedAt }) => ({
  createdAt: new Date(createdAt),
  releasedAt: new Date(releasedAt),
});
 
const convertAssets = (graphQLRelease) => {
  let sources = [];
  if (graphQLRelease.assets.sources?.nodes) {
    sources = [...graphQLRelease.assets.sources.nodes];
  }
 
  let links = [];
  if (graphQLRelease.assets.links?.nodes) {
    links = graphQLRelease.assets.links.nodes.map((l) => ({
      ...l,
      linkType: l.linkType?.toLowerCase(),
    }));
  }
 
  return {
    assets: {
      count: graphQLRelease.assets.count,
      sources,
      links,
    },
  };
};
 
const convertEvidences = (graphQLRelease) => ({
  evidences: (graphQLRelease.evidences?.nodes ?? []).map((e) => ({ ...e })),
});
 
const convertLinks = (graphQLRelease) => ({
  _links: {
    ...graphQLRelease.links,
    self: graphQLRelease.links?.selfUrl,
  },
});
 
const convertCommit = (graphQLRelease) => {
  if (!graphQLRelease.commit) {
    return {};
  }
 
  return {
    commit: {
      shortId: truncateSha(graphQLRelease.commit.sha),
      title: graphQLRelease.commit.title,
    },
    commitPath: graphQLRelease.commit.webUrl,
  };
};
 
const convertAuthor = (graphQLRelease) => ({ author: graphQLRelease.author });
 
const convertMilestones = (graphQLRelease) => ({
  milestones: graphQLRelease.milestones.nodes.map((m) => ({
    ...m,
    webUrl: m.webPath,
    webPath: undefined,
    issueStats: m.stats
      ? {
          total: m.stats.totalIssuesCount,
          closed: m.stats.closedIssuesCount,
        }
      : {},
    stats: undefined,
  })),
});
 
/**
 * Converts a single release object fetched from GraphQL
 * into a release object that matches the general structure of the REST API
 *
 * @param graphQLRelease The release object returned from a GraphQL query
 */
export const convertGraphQLRelease = (graphQLRelease) => ({
  ...convertScalarProperties(graphQLRelease),
  ...convertDateProperties(graphQLRelease),
  ...convertAssets(graphQLRelease),
  ...convertEvidences(graphQLRelease),
  ...convertLinks(graphQLRelease),
  ...convertCommit(graphQLRelease),
  ...convertAuthor(graphQLRelease),
  ...convertMilestones(graphQLRelease),
});
 
/**
 * Converts the response from all_releases.query.graphql into the
 * same shape as is returned from the Releases REST API.
 *
 * This allows the release components to use the response
 * from either endpoint interchangeably.
 *
 * @param response The response received from the GraphQL endpoint
 */
export const convertAllReleasesGraphQLResponse = (response) => {
  const releases = response.data.project.releases.nodes.map(convertGraphQLRelease);
 
  const paginationInfo = {
    ...response.data.project.releases.pageInfo,
  };
 
  return { data: releases, paginationInfo };
};
 
/**
 * Converts the response from one_release.query.graphql into the
 * same shape as is returned from the Releases REST API.
 *
 * This allows the release components to use the response
 * from either endpoint interchangeably.
 *
 * @param response The response received from the GraphQL endpoint
 */
export const convertOneReleaseGraphQLResponse = (response) => {
  const release = convertGraphQLRelease(response.data.project.release);
 
  return { data: release };
};