debian-mirror-gitlab/app/assets/javascripts/import_entities/import_groups/graphql/services/status_poller.js

69 lines
1.9 KiB
JavaScript
Raw Normal View History

2021-02-22 17:27:13 +05:30
import gql from 'graphql-tag';
import createFlash from '~/flash';
import { s__ } from '~/locale';
import bulkImportSourceGroupsQuery from '../queries/bulk_import_source_groups.query.graphql';
import { STATUSES } from '../../../constants';
import { SourceGroupsManager } from './source_groups_manager';
2021-03-08 18:12:59 +05:30
const groupId = (i) => `group${i}`;
2021-02-22 17:27:13 +05:30
function generateGroupsQuery(groups) {
return gql`{
${groups
.map(
(g, idx) =>
`${groupId(idx)}: group(fullPath: "${g.import_target.target_namespace}/${
g.import_target.new_name
}") { id }`,
)
.join('\n')}
}`;
}
export class StatusPoller {
constructor({ client, interval }) {
this.client = client;
this.interval = interval;
this.timeoutId = null;
this.groupManager = new SourceGroupsManager({ client });
}
startPolling() {
if (this.timeoutId) {
return;
}
this.checkPendingImports();
}
stopPolling() {
clearTimeout(this.timeoutId);
this.timeoutId = null;
}
async checkPendingImports() {
try {
const { bulkImportSourceGroups } = this.client.readQuery({
query: bulkImportSourceGroupsQuery,
});
2021-03-08 18:12:59 +05:30
const groupsInProgress = bulkImportSourceGroups.filter((g) => g.status === STATUSES.STARTED);
2021-02-22 17:27:13 +05:30
if (groupsInProgress.length) {
const { data: results } = await this.client.query({
query: generateGroupsQuery(groupsInProgress),
fetchPolicy: 'no-cache',
});
const completedGroups = groupsInProgress.filter((_, idx) => Boolean(results[groupId(idx)]));
2021-03-08 18:12:59 +05:30
completedGroups.forEach((group) => {
2021-02-22 17:27:13 +05:30
this.groupManager.setImportStatus(group, STATUSES.FINISHED);
});
}
} catch (e) {
createFlash({
message: s__('BulkImport|Update of import statuses with realtime changes failed'),
});
} finally {
this.timeoutId = setTimeout(() => this.checkPendingImports(), this.interval);
}
}
}