diff --git a/Gemfile b/Gemfile index 914a81cc5f0..297b3025507 100644 --- a/Gemfile +++ b/Gemfile @@ -28,7 +28,7 @@ gem 'sprockets', '~> 3.7.0' gem 'view_component', '~> 2.82.0' # Supported DBs -gem 'pg', '~> 1.4.6' +gem 'pg', '~> 1.5.3' gem 'neighbor', '~> 0.2.3' diff --git a/Gemfile.checksum b/Gemfile.checksum index 0af30976daa..5471e4e7ea7 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -439,10 +439,10 @@ {"name":"parslet","version":"1.8.2","platform":"ruby","checksum":"08d1ab3721cd3f175bfbee8788b2ddff71f92038f2d69bd65454c22bb9fbd98a"}, {"name":"pastel","version":"0.8.0","platform":"ruby","checksum":"481da9fb7d2f6e6b1a08faf11fa10363172dc40fd47848f096ae21209f805a75"}, {"name":"peek","version":"1.1.0","platform":"ruby","checksum":"d6501ead8cde46d8d8ed0d59eb6f0ba713d0a41c11a2c4a81447b2dce37b3ecc"}, -{"name":"pg","version":"1.4.6","platform":"ruby","checksum":"d98f3dcb4a6ae29780a2219340cb0e55dbafbb7eb4ccc2b99f892f2569a7a61e"}, -{"name":"pg","version":"1.4.6","platform":"x64-mingw-ucrt","checksum":"1efb4f932d5579b87b1c37e0ef49d101925d4f0e3fcf282569aed0382a522b68"}, -{"name":"pg","version":"1.4.6","platform":"x64-mingw32","checksum":"26c4a010fe2cefe61f56f0c4ba9a86b6e99d0965af100f30eaba1602a167af56"}, -{"name":"pg","version":"1.4.6","platform":"x86-mingw32","checksum":"14376f8a122ec58b9e1b4123774e7eafb59222544b7c6cfaa379c6ef28785ae6"}, +{"name":"pg","version":"1.5.3","platform":"ruby","checksum":"6b9ee5e2d5aee975588232c41f8203e766157cf71dba54ee85b343a45ced9bfd"}, +{"name":"pg","version":"1.5.3","platform":"x64-mingw-ucrt","checksum":"1f2a6b2afaf0ccb8afe8b6a00131bce8151fbd6e8826b2d944288f6f2b615389"}, +{"name":"pg","version":"1.5.3","platform":"x64-mingw32","checksum":"ab7f5f3020323094a2b16f9638166b04c103e152a9079a1b8e795f4bf79765e0"}, +{"name":"pg","version":"1.5.3","platform":"x86-mingw32","checksum":"aa6ddda9887462d30a6d49d875eb9d27fca8cdb7185103b650e7351b38f15ddf"}, {"name":"pg_query","version":"2.2.1","platform":"ruby","checksum":"6086972bbf4eab86d8425b35f14ca8b6fe41e4341423582801c1ec86ff5f8cea"}, {"name":"plist","version":"3.6.0","platform":"ruby","checksum":"f468bcf6b72ec6d1585ed6744eb4817c1932a5bf91895ed056e69b7f12ca10f2"}, {"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"}, diff --git a/Gemfile.lock b/Gemfile.lock index 82ac228c6cd..e2054d98a13 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1136,7 +1136,7 @@ GEM tty-color (~> 0.5) peek (1.1.0) railties (>= 4.0.0) - pg (1.4.6) + pg (1.5.3) pg_query (2.2.1) google-protobuf (>= 3.19.2) plist (3.6.0) @@ -1866,7 +1866,7 @@ DEPENDENCIES parallel (~> 1.19) parslet (~> 1.8) peek (~> 1.1) - pg (~> 1.4.6) + pg (~> 1.5.3) pg_query (~> 2.2, >= 2.2.1) png_quantizator (~> 0.2.1) premailer-rails (~> 1.10.3) diff --git a/app/assets/javascripts/environments/components/confirm_rollback_modal.vue b/app/assets/javascripts/environments/components/confirm_rollback_modal.vue index 9db3011ba5d..2cf71de7ea2 100644 --- a/app/assets/javascripts/environments/components/confirm_rollback_modal.vue +++ b/app/assets/javascripts/environments/components/confirm_rollback_modal.vue @@ -3,6 +3,7 @@ * Render modal to confirm rollback/redeploy. */ import { GlModal, GlSprintf, GlLink } from '@gitlab/ui'; +import * as Sentry from '@sentry/browser'; import { escape } from 'lodash'; import csrf from '~/lib/utils/csrf'; import { __, s__, sprintf } from '~/locale'; @@ -125,10 +126,17 @@ export default { }, onOk() { if (this.graphql) { - this.$apollo.mutate({ - mutation: rollbackEnvironment, - variables: { environment: this.environment }, - }); + this.$apollo + .mutate({ + mutation: rollbackEnvironment, + variables: { environment: this.environment }, + }) + .then(() => { + this.$emit('rollback'); + }) + .catch((e) => { + Sentry.captureException(e); + }); } else { eventHub.$emit('rollbackEnvironment', this.environment); } diff --git a/app/assets/javascripts/environments/environment_details/constants.js b/app/assets/javascripts/environments/environment_details/constants.js index 07579092e23..e7b10aed20d 100644 --- a/app/assets/javascripts/environments/environment_details/constants.js +++ b/app/assets/javascripts/environments/environment_details/constants.js @@ -1,6 +1,7 @@ import { __, s__ } from '~/locale'; import { helpPagePath } from '~/helpers/help_page_helper'; +export const ENVIRONMENT_DETAILS_QUERY_POLLING_INTERVAL = 3000; export const ENVIRONMENT_DETAILS_PAGE_SIZE = 20; export const ENVIRONMENT_DETAILS_TABLE_FIELDS = [ { diff --git a/app/assets/javascripts/environments/environment_details/index.vue b/app/assets/javascripts/environments/environment_details/index.vue index f91e68e793f..1b7320df674 100644 --- a/app/assets/javascripts/environments/environment_details/index.vue +++ b/app/assets/javascripts/environments/environment_details/index.vue @@ -1,6 +1,7 @@ diff --git a/app/assets/javascripts/environments/graphql/client.js b/app/assets/javascripts/environments/graphql/client.js index bb6f57e7e80..b7754558b10 100644 --- a/app/assets/javascripts/environments/graphql/client.js +++ b/app/assets/javascripts/environments/graphql/client.js @@ -13,6 +13,7 @@ import typeDefs from './typedefs.graphql'; export const apolloProvider = (endpoint) => { const defaultClient = createDefaultClient(resolvers(endpoint), { typeDefs, + useGet: true, }); const { cache } = defaultClient; diff --git a/app/assets/javascripts/environments/mount_show.js b/app/assets/javascripts/environments/mount_show.js index 5e812c85c96..364f68cefb7 100644 --- a/app/assets/javascripts/environments/mount_show.js +++ b/app/assets/javascripts/environments/mount_show.js @@ -94,6 +94,7 @@ export const initPage = async () => { router, provide: { projectPath: dataSet.projectFullPath, + graphqlEtagKey: dataSet.graphqlEtagPath, }, render(createElement) { return createElement('router-view'); diff --git a/app/assets/javascripts/graphql_shared/utils.js b/app/assets/javascripts/graphql_shared/utils.js index 806e89d6e9f..198d9f980f0 100644 --- a/app/assets/javascripts/graphql_shared/utils.js +++ b/app/assets/javascripts/graphql_shared/utils.js @@ -1,4 +1,5 @@ import { isArray } from 'lodash'; +import Visibility from 'visibilityjs'; /** * Ids generated by GraphQL endpoints are usually in the format @@ -116,3 +117,29 @@ export const convertNodeIdsFromGraphQLIds = (nodes) => { export const getNodesOrDefault = (queryData, nodesField = 'nodes') => { return queryData?.[nodesField] ?? []; }; + +export const toggleQueryPollingByVisibility = (queryRef, interval = 10000) => { + const stopStartQuery = (query) => { + if (!Visibility.hidden()) { + query.startPolling(interval); + } else { + query.stopPolling(); + } + }; + + stopStartQuery(queryRef); + Visibility.change(stopStartQuery.bind(null, queryRef)); +}; + +export const etagQueryHeaders = (featureCorrelation, etagResource = '') => { + return { + fetchOptions: { + method: 'GET', + }, + headers: { + 'X-GITLAB-GRAPHQL-FEATURE-CORRELATION': featureCorrelation, + 'X-GITLAB-GRAPHQL-RESOURCE-ETAG': etagResource, + 'X-Requested-With': 'XMLHttpRequest', + }, + }; +}; diff --git a/app/assets/javascripts/pipelines/components/graph/utils.js b/app/assets/javascripts/pipelines/components/graph/utils.js index 54985a24593..c888c8a5537 100644 --- a/app/assets/javascripts/pipelines/components/graph/utils.js +++ b/app/assets/javascripts/pipelines/components/graph/utils.js @@ -1,11 +1,12 @@ import { isEmpty } from 'lodash'; -import Visibility from 'visibilityjs'; -import { getIdFromGraphQLId } from '~/graphql_shared/utils'; +import { getIdFromGraphQLId, etagQueryHeaders } from '~/graphql_shared/utils'; import { reportToSentry } from '../../utils'; import { listByLayers } from '../parsing_utils'; import { unwrapStagesWithNeedsAndLookup } from '../unwrapping_utils'; import { beginPerfMeasure, finishPerfMeasureAndSend } from './perf_utils'; +export { toggleQueryPollingByVisibility } from '~/graphql_shared/utils'; + const addMulti = (mainPipelineProjectPath, linkedPipeline) => { return { ...linkedPipeline, @@ -35,18 +36,8 @@ const calculatePipelineLayersInfo = (pipeline, componentName, metricsPath) => { return layers; }; -const getQueryHeaders = (etagResource) => { - return { - fetchOptions: { - method: 'GET', - }, - headers: { - 'X-GITLAB-GRAPHQL-FEATURE-CORRELATION': 'verify/ci/pipeline-graph', - 'X-GITLAB-GRAPHQL-RESOURCE-ETAG': etagResource, - 'X-Requested-With': 'XMLHttpRequest', - }, - }; -}; +const getQueryHeaders = (etagResource) => + etagQueryHeaders('verify/ci/pipeline-graph', etagResource); const serializeGqlErr = (gqlError) => { const { locations = [], message = '', path = [] } = gqlError; @@ -80,19 +71,6 @@ const serializeLoadErrors = (errors) => { return message; }; -const toggleQueryPollingByVisibility = (queryRef, interval = 10000) => { - const stopStartQuery = (query) => { - if (!Visibility.hidden()) { - query.startPolling(interval); - } else { - query.stopPolling(); - } - }; - - stopStartQuery(queryRef); - Visibility.change(stopStartQuery.bind(null, queryRef)); -}; - const transformId = (linkedPipeline) => { return { ...linkedPipeline, id: getIdFromGraphQLId(linkedPipeline.id) }; }; @@ -133,7 +111,6 @@ export { getQueryHeaders, serializeGqlErr, serializeLoadErrors, - toggleQueryPollingByVisibility, unwrapPipelineData, validateConfigPaths, }; diff --git a/app/assets/javascripts/super_sidebar/components/menu_section.vue b/app/assets/javascripts/super_sidebar/components/menu_section.vue index 86bf3837c10..49e481feb04 100644 --- a/app/assets/javascripts/super_sidebar/components/menu_section.vue +++ b/app/assets/javascripts/super_sidebar/components/menu_section.vue @@ -1,4 +1,5 @@