WikiEducationFoundation/WikiEduDashboard

View on GitHub
app/assets/javascripts/utils/article_finder_utils.js

Summary

Maintainability
A
0 mins
Test Coverage
B
87%
import { forEach } from 'lodash-es';
import logErrorMessage from './log_error_message';
import fetchJsonp from 'fetch-jsonp';
import { stringify } from 'query-string';
import { toWikiDomain } from './wiki_utils';

export const queryUrl = async (url, query = {}) => {
  const hasParams = url.includes('?'); // the url might already have params

  // if the url already has params, we need to add a & to the query string
  // if not, we need to add a ? to the query string
  const queryString = `${hasParams ? '&' : '?'}${stringify(query)}`; // add the query string

  const response = await fetchJsonp(`${url}${queryString}`);
  if (!response.ok) {
    const data = await response.text();
    response.responseText = data;
    logErrorMessage(response);
    throw response;
  }
  return response.json();
};

export const categoryQueryGenerator = (category, cmcontinue, namespace) => {
  return {
    list: 'categorymembers',
    cmtitle: category,
    cmlimit: 50,
    cmnamespace: namespace,
    cmcontinue: cmcontinue
  };
};

export const multipleQueryGenerator = (params) => {
  let query = '';
  params.forEach((param) => {
    query += `${param}|`;
  });
  query = query.substr(0, query.length - 1);
  return query;
};

export const pageAssessmentQueryGenerator = (titles) => {
  return {
    prop: 'pageassessments',
    titles: multipleQueryGenerator(titles),
    palimit: 500
  };
};

export const pageRevisionQueryGenerator = (titles) => {
  return {
    prop: 'revisions',
    titles: multipleQueryGenerator(titles),
    rvprop: 'userid|ids|timestamp'
  };
};

export const pageRevisionScoreQueryGenerator = (revids, project) => {
  return {
    models: `${project === 'wikidata' ? 'itemquality' : 'wp10'}`,
    revids: multipleQueryGenerator(revids)
  };
};

export const keywordQueryGenerator = (keyword, offset) => {
  return {
    list: 'search',
    srsearch: keyword,
    srlimit: 50,
    srinfo: 'totalhits',
    srprop: '',
    sroffset: offset
  };
};

export const pageviewQueryGenerator = (pageids) => {
  return {
    prop: 'pageviews',
    pageids: multipleQueryGenerator(pageids)
  };
};

export const extractClassGrade = (pageAssessments) => {
  let classGrade = '';
  forEach(pageAssessments, (pageAssessment) => {
    if (pageAssessment.class) {
      classGrade = pageAssessment.class;
      return false;
    }
  });
  return classGrade;
};


export const keywordAutocompleteGenerator = (keyword) => {
  return {
    list: 'search',
    srsearch: keyword,
    srlimit: 5,
    srinfo: 'totalhits',
    srprop: '',
  };
};

export const fetchArticleAutocompleteResults = async (keyword, wiki) => {
  const query = keywordAutocompleteGenerator(keyword);

  return queryUrl(`https://${toWikiDomain(wiki)}/w/api.php?action=query&format=json&origin=*`, query).then((data) => {
    return data.query.search.map(item => item.title);
  });
};