From 0b7591edce953a49fe0fa0d4e6e65477f6bb1d83 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Thu, 26 Sep 2024 13:29:46 +0000 Subject: [PATCH 1/3] refactor: remove whole graphql implementation --- packages/backend/package.json | 6 - .../backend/src/graphql/mutation-resolvers.js | 3 - .../mutations/delete-app-auth-client.ee.js | 16 - .../src/graphql/mutations/update-flow.js | 18 - .../src/graphql/mutations/update-role.ee.js | 62 --- packages/backend/src/graphql/resolvers.js | 7 - packages/backend/src/graphql/schema.graphql | 324 ---------------- .../backend/src/helpers/authentication.js | 17 - .../src/helpers/authentication.test.js | 74 ---- .../backend/src/helpers/graphql-instance.js | 53 --- packages/backend/src/helpers/morgan.js | 12 +- packages/backend/src/helpers/sentry.ee.js | 1 - packages/backend/src/routes/index.js | 2 - packages/web/package.json | 2 - .../components/AccountDropdownMenu/index.jsx | 3 +- .../index.jsx | 5 +- .../src/components/ApolloProvider/index.jsx | 34 -- .../DeleteAccountDialog/index.ee.jsx | 3 - .../src/components/EditorNew/EditorNew.jsx | 1 - .../src/components/SignUpForm/index.ee.jsx | 1 - packages/web/src/config/app.js | 1 - packages/web/src/graphql/cache.js | 13 - packages/web/src/graphql/client.js | 31 -- packages/web/src/graphql/link.js | 46 --- packages/web/src/graphql/pagination.js | 32 -- .../src/graphql/queries/get-dynamic-fields.js | 69 ---- packages/web/src/index.jsx | 13 +- yarn.lock | 360 +----------------- 28 files changed, 28 insertions(+), 1181 deletions(-) delete mode 100644 packages/backend/src/graphql/mutation-resolvers.js delete mode 100644 packages/backend/src/graphql/mutations/delete-app-auth-client.ee.js delete mode 100644 packages/backend/src/graphql/mutations/update-flow.js delete mode 100644 packages/backend/src/graphql/mutations/update-role.ee.js delete mode 100644 packages/backend/src/graphql/resolvers.js delete mode 100644 packages/backend/src/graphql/schema.graphql delete mode 100644 packages/backend/src/helpers/authentication.test.js delete mode 100644 packages/backend/src/helpers/graphql-instance.js delete mode 100644 packages/web/src/components/ApolloProvider/index.jsx delete mode 100644 packages/web/src/graphql/cache.js delete mode 100644 packages/web/src/graphql/client.js delete mode 100644 packages/web/src/graphql/link.js delete mode 100644 packages/web/src/graphql/pagination.js delete mode 100644 packages/web/src/graphql/queries/get-dynamic-fields.js diff --git a/packages/backend/package.json b/packages/backend/package.json index 281134fe..7140bacc 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -23,8 +23,6 @@ "dependencies": { "@bull-board/express": "^3.10.1", "@casl/ability": "^6.5.0", - "@graphql-tools/graphql-file-loader": "^7.3.4", - "@graphql-tools/load": "^7.5.2", "@node-saml/passport-saml": "^4.0.4", "@rudderstack/rudder-sdk-node": "^1.1.2", "@sentry/node": "^7.42.0", @@ -41,11 +39,7 @@ "express": "~4.18.2", "express-async-errors": "^3.1.1", "express-basic-auth": "^1.2.1", - "express-graphql": "^0.12.0", "fast-xml-parser": "^4.0.11", - "graphql-middleware": "^6.1.15", - "graphql-shield": "^7.5.0", - "graphql-tools": "^8.2.0", "handlebars": "^4.7.7", "http-errors": "~1.6.3", "http-proxy-agent": "^7.0.0", diff --git a/packages/backend/src/graphql/mutation-resolvers.js b/packages/backend/src/graphql/mutation-resolvers.js deleted file mode 100644 index fa95c17c..00000000 --- a/packages/backend/src/graphql/mutation-resolvers.js +++ /dev/null @@ -1,3 +0,0 @@ -const mutationResolvers = {}; - -export default mutationResolvers; diff --git a/packages/backend/src/graphql/mutations/delete-app-auth-client.ee.js b/packages/backend/src/graphql/mutations/delete-app-auth-client.ee.js deleted file mode 100644 index 0bc84e45..00000000 --- a/packages/backend/src/graphql/mutations/delete-app-auth-client.ee.js +++ /dev/null @@ -1,16 +0,0 @@ -import AppAuthClient from '../../models/app-auth-client'; - -const deleteAppAuthClient = async (_parent, params, context) => { - context.currentUser.can('delete', 'App'); - - await AppAuthClient.query() - .delete() - .findOne({ - id: params.input.id, - }) - .throwIfNotFound(); - - return; -}; - -export default deleteAppAuthClient; diff --git a/packages/backend/src/graphql/mutations/update-flow.js b/packages/backend/src/graphql/mutations/update-flow.js deleted file mode 100644 index e8e21ef9..00000000 --- a/packages/backend/src/graphql/mutations/update-flow.js +++ /dev/null @@ -1,18 +0,0 @@ -const updateFlow = async (_parent, params, context) => { - context.currentUser.can('update', 'Flow'); - - let flow = await context.currentUser - .$relatedQuery('flows') - .findOne({ - id: params.input.id, - }) - .throwIfNotFound(); - - flow = await flow.$query().patchAndFetch({ - name: params.input.name, - }); - - return flow; -}; - -export default updateFlow; diff --git a/packages/backend/src/graphql/mutations/update-role.ee.js b/packages/backend/src/graphql/mutations/update-role.ee.js deleted file mode 100644 index 2566dc40..00000000 --- a/packages/backend/src/graphql/mutations/update-role.ee.js +++ /dev/null @@ -1,62 +0,0 @@ -import Role from '../../models/role.js'; -import Permission from '../../models/permission.js'; -import permissionCatalog from '../../helpers/permission-catalog.ee.js'; - -const updateRole = async (_parent, params, context) => { - context.currentUser.can('update', 'Role'); - - const { id, name, description, permissions } = params.input; - - const role = await Role.query().findById(id).throwIfNotFound(); - - try { - const updatedRole = await Role.transaction(async (trx) => { - await role.$relatedQuery('permissions', trx).delete(); - - if (permissions?.length) { - const sanitizedPermissions = permissions - .filter((permission) => { - const { action, subject, conditions } = permission; - - const relevantAction = permissionCatalog.actions.find( - (actionCatalogItem) => actionCatalogItem.key === action - ); - const validSubject = relevantAction.subjects.includes(subject); - const validConditions = conditions.every((condition) => { - return !!permissionCatalog.conditions.find( - (conditionCatalogItem) => conditionCatalogItem.key === condition - ); - }); - - return validSubject && validConditions; - }) - .map((permission) => ({ - ...permission, - roleId: role.id, - })); - - await Permission.query().insert(sanitizedPermissions); - } - - await role.$query(trx).patch({ - name, - description, - }); - - return await Role.query(trx) - .leftJoinRelated({ - permissions: true, - }) - .withGraphFetched({ - permissions: true, - }) - .findById(id); - }); - - return updatedRole; - } catch (err) { - throw new Error('The role could not be updated!'); - } -}; - -export default updateRole; diff --git a/packages/backend/src/graphql/resolvers.js b/packages/backend/src/graphql/resolvers.js deleted file mode 100644 index 70021c51..00000000 --- a/packages/backend/src/graphql/resolvers.js +++ /dev/null @@ -1,7 +0,0 @@ -import mutationResolvers from './mutation-resolvers.js'; - -const resolvers = { - Mutation: mutationResolvers, -}; - -export default resolvers; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql deleted file mode 100644 index cade7b74..00000000 --- a/packages/backend/src/graphql/schema.graphql +++ /dev/null @@ -1,324 +0,0 @@ -type Query { - placeholderQuery(name: String): Boolean -} - -type Mutation { - placeholderQuery(name: String): Boolean -} - -type Trigger { - name: String - key: String - description: String - showWebhookUrl: Boolean - pollInterval: Int - type: String - substeps: [Substep] -} - -type Action { - name: String - key: String - description: String - substeps: [Substep] -} - -type Substep { - key: String - name: String - arguments: [SubstepArgument] -} - -type SubstepArgument { - label: String - key: String - type: String - description: String - required: Boolean - variables: Boolean - options: [SubstepArgumentOption] - source: SubstepArgumentSource - additionalFields: SubstepArgumentAdditionalFields - dependsOn: [String] - fields: [SubstepArgument] - value: JSONObject -} - -type SubstepArgumentOption { - label: String - value: JSONObject -} - -type SubstepArgumentSource { - type: String - name: String - arguments: [SubstepArgumentSourceArgument] -} - -type SubstepArgumentSourceArgument { - name: String - value: String -} - -type SubstepArgumentAdditionalFields { - type: String - name: String - arguments: [SubstepArgumentAdditionalFieldsArgument] -} - -type SubstepArgumentAdditionalFieldsArgument { - name: String - value: String -} - -type App { - name: String - key: String - connectionCount: Int - flowCount: Int - iconUrl: String - docUrl: String - authDocUrl: String - primaryColor: String - supportsConnections: Boolean - auth: AppAuth - triggers: [Trigger] - actions: [Action] - connections: [Connection] -} - -type AppAuth { - fields: [Field] - authenticationSteps: [AuthenticationStep] - sharedAuthenticationSteps: [AuthenticationStep] - reconnectionSteps: [ReconnectionStep] - sharedReconnectionSteps: [ReconnectionStep] -} - -enum ArgumentEnumType { - integer - string -} - -type AuthenticationStep { - type: String - name: String - arguments: [AuthenticationStepArgument] -} - -type AuthenticationStepArgument { - name: String - value: String - type: ArgumentEnumType - properties: [AuthenticationStepProperty] -} - -type AuthenticationStepProperty { - name: String - value: String -} - -type Connection { - id: String - key: String - reconnectable: Boolean - appAuthClientId: String - formattedData: ConnectionData - verified: Boolean - app: App - createdAt: String - flowCount: Int -} - -type ConnectionData { - screenName: String -} - -type ExecutionStep { - id: String - executionId: String - stepId: String - step: Step - status: String - dataIn: JSONObject - dataOut: JSONObject - errorDetails: JSONObject - createdAt: String - updatedAt: String -} - -type Field { - key: String - label: String - type: String - required: Boolean - readOnly: Boolean - value: String - placeholder: String - description: String - docUrl: String - clickToCopy: Boolean - options: [SubstepArgumentOption] -} - -enum FlowStatus { - paused - published - draft -} - -type Flow { - id: String - name: String - active: Boolean - steps: [Step] - createdAt: String - updatedAt: String - status: FlowStatus -} - -type SamlAuthProvidersRoleMapping { - id: String - samlAuthProviderId: String - roleId: String - remoteRoleName: String -} - -input UserRoleInput { - id: String -} - -""" -The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). -""" -scalar JSONObject - -input PreviousStepInput { - id: String -} - -type ReconnectionStep { - type: String - name: String - arguments: [ReconnectionStepArgument] -} - -type ReconnectionStepArgument { - name: String - value: String - type: ArgumentEnumType - properties: [ReconnectionStepProperty] -} - -type ReconnectionStepProperty { - name: String - value: String -} - -type Step { - id: String - previousStepId: String - key: String - appKey: String - iconUrl: String - webhookUrl: String - type: StepEnumType - parameters: JSONObject - connection: Connection - flow: Flow - position: Int - status: String - executionSteps: [ExecutionStep] -} - -input StepConnectionInput { - id: String -} - -enum StepEnumType { - trigger - action -} - -input StepFlowInput { - id: String -} - -input StepInput { - id: String - previousStepId: String - key: String - appKey: String - connection: StepConnectionInput - flow: StepFlowInput - parameters: JSONObject - previousStep: PreviousStepInput -} - -type User { - id: String - fullName: String - email: String - role: Role - permissions: [Permission] - createdAt: String - updatedAt: String -} - -type Role { - id: String - name: String - key: String - description: String - isAdmin: Boolean - permissions: [Permission] -} - -type PageInfo { - currentPage: Int! - totalPages: Int! -} - -type ExecutionStepEdge { - node: ExecutionStep -} - -type ExecutionStepConnection { - edges: [ExecutionStepEdge] - pageInfo: PageInfo -} - -type License { - id: String - name: String - expireAt: String - verified: Boolean -} - -type Permission { - id: String - action: String - subject: String - conditions: [String] -} - -type Action { - label: String - key: String - subjects: [String] -} - -type Condition { - key: String - label: String -} - -type Subject { - label: String - key: String -} - -schema { - query: Query - mutation: Mutation -} diff --git a/packages/backend/src/helpers/authentication.js b/packages/backend/src/helpers/authentication.js index b2eeeffa..ac7c3426 100644 --- a/packages/backend/src/helpers/authentication.js +++ b/packages/backend/src/helpers/authentication.js @@ -1,4 +1,3 @@ -import { rule, shield } from 'graphql-shield'; import User from '../models/user.js'; import AccessToken from '../models/access-token.js'; @@ -47,19 +46,3 @@ export const authenticateUser = async (request, response, next) => { return response.status(401).end(); } }; - -const isAuthenticatedRule = rule()(isAuthenticated); - -export const authenticationRules = { - Mutation: { - '*': isAuthenticatedRule, - }, -}; - -const authenticationOptions = { - allowExternalErrors: true, -}; - -const authentication = shield(authenticationRules, authenticationOptions); - -export default authentication; diff --git a/packages/backend/src/helpers/authentication.test.js b/packages/backend/src/helpers/authentication.test.js deleted file mode 100644 index a5a4b60f..00000000 --- a/packages/backend/src/helpers/authentication.test.js +++ /dev/null @@ -1,74 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import { allow } from 'graphql-shield'; -import { isAuthenticated, authenticationRules } from './authentication.js'; -import { createUser } from '../../test/factories/user.js'; -import createAuthTokenByUserId from '../helpers/create-auth-token-by-user-id.js'; - -describe('isAuthenticated', () => { - it('should return false if no token is provided', async () => { - const req = { headers: {} }; - expect(await isAuthenticated(null, null, req)).toBe(false); - }); - - it('should return false if token is invalid', async () => { - const req = { headers: { authorization: 'invalidToken' } }; - expect(await isAuthenticated(null, null, req)).toBe(false); - }); - - it('should return true if token is valid and there is a user', async () => { - const user = await createUser(); - const token = await createAuthTokenByUserId(user.id); - - const req = { headers: { authorization: token } }; - expect(await isAuthenticated(null, null, req)).toBe(true); - }); - - it('should return false if token is valid and but there is no user', async () => { - const user = await createUser(); - const token = await createAuthTokenByUserId(user.id); - await user.$query().delete(); - - const req = { headers: { authorization: token } }; - expect(await isAuthenticated(null, null, req)).toBe(false); - }); -}); - -describe('authentication rules', () => { - const getQueryAndMutationNames = (rules) => { - const queries = Object.keys(rules.Query || {}); - const mutations = Object.keys(rules.Mutation || {}); - return { queries, mutations }; - }; - - const { queries, mutations } = getQueryAndMutationNames(authenticationRules); - - if (queries.length) { - describe('for queries', () => { - queries.forEach((query) => { - it(`should apply correct rule for query: ${query}`, () => { - const ruleApplied = authenticationRules.Query[query]; - - if (query === '*') { - expect(ruleApplied.func).toBe(isAuthenticated); - } else { - expect(ruleApplied).toEqual(allow); - } - }); - }); - }); - } - - describe('for mutations', () => { - mutations.forEach((mutation) => { - it(`should apply correct rule for mutation: ${mutation}`, () => { - const ruleApplied = authenticationRules.Mutation[mutation]; - - if (mutation === '*') { - expect(ruleApplied.func).toBe(isAuthenticated); - } else { - expect(ruleApplied).toBe(allow); - } - }); - }); - }); -}); diff --git a/packages/backend/src/helpers/graphql-instance.js b/packages/backend/src/helpers/graphql-instance.js deleted file mode 100644 index a8a50db7..00000000 --- a/packages/backend/src/helpers/graphql-instance.js +++ /dev/null @@ -1,53 +0,0 @@ -import path, { join } from 'path'; -import { fileURLToPath } from 'url'; -import { graphqlHTTP } from 'express-graphql'; -import { loadSchemaSync } from '@graphql-tools/load'; -import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'; -import { addResolversToSchema } from '@graphql-tools/schema'; -import { applyMiddleware } from 'graphql-middleware'; - -import appConfig from '../config/app.js'; -import logger from './logger.js'; -import authentication from './authentication.js'; -import * as Sentry from './sentry.ee.js'; -import resolvers from '../graphql/resolvers.js'; -import HttpError from '../errors/http.js'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -const schema = loadSchemaSync(join(__dirname, '../graphql/schema.graphql'), { - loaders: [new GraphQLFileLoader()], -}); - -const schemaWithResolvers = addResolversToSchema({ - schema, - resolvers, -}); - -const graphQLInstance = graphqlHTTP({ - schema: applyMiddleware( - schemaWithResolvers, - authentication.generate(schemaWithResolvers) - ), - graphiql: appConfig.isDev, - customFormatErrorFn: (error) => { - logger.error(error.path + ' : ' + error.message + '\n' + error.stack); - - if (error.originalError instanceof HttpError) { - delete error.originalError.response; - } - - Sentry.captureException(error, { - tags: { graphql: true }, - extra: { - source: error.source?.body, - positions: error.positions, - path: error.path, - }, - }); - - return error; - }, -}); - -export default graphQLInstance; diff --git a/packages/backend/src/helpers/morgan.js b/packages/backend/src/helpers/morgan.js index 63d78538..12484f2d 100644 --- a/packages/backend/src/helpers/morgan.js +++ b/packages/backend/src/helpers/morgan.js @@ -6,18 +6,8 @@ const stream = { logger.http(message.substring(0, message.lastIndexOf('\n'))), }; -const registerGraphQLToken = () => { - morgan.token('graphql-query', (req) => { - if (req.body.query) { - return `\n GraphQL ${req.body.query}`; - } - }); -}; - -registerGraphQLToken(); - const morganMiddleware = morgan( - ':method :url :status :res[content-length] - :response-time ms :graphql-query', + ':method :url :status :res[content-length] - :response-time ms', { stream } ); diff --git a/packages/backend/src/helpers/sentry.ee.js b/packages/backend/src/helpers/sentry.ee.js index f8f8b6f7..141c5238 100644 --- a/packages/backend/src/helpers/sentry.ee.js +++ b/packages/backend/src/helpers/sentry.ee.js @@ -17,7 +17,6 @@ export function init(app) { integrations: [ app && new Sentry.Integrations.Http({ tracing: true }), app && new Tracing.Integrations.Express({ app }), - app && new Tracing.Integrations.GraphQL(), ].filter(Boolean), tracesSampleRate: 1.0, }); diff --git a/packages/backend/src/routes/index.js b/packages/backend/src/routes/index.js index 59de8561..c3ad6de0 100644 --- a/packages/backend/src/routes/index.js +++ b/packages/backend/src/routes/index.js @@ -1,5 +1,4 @@ import { Router } from 'express'; -import graphQLInstance from '../helpers/graphql-instance.js'; import webhooksRouter from './webhooks.js'; import paddleRouter from './paddle.ee.js'; import healthcheckRouter from './healthcheck.js'; @@ -23,7 +22,6 @@ import installationUsersRouter from './api/v1/installation/users.js'; const router = Router(); -router.use('/graphql', graphQLInstance); router.use('/webhooks', webhooksRouter); router.use('/paddle', paddleRouter); router.use('/healthcheck', healthcheckRouter); diff --git a/packages/web/package.json b/packages/web/package.json index a785985b..b811465c 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -4,7 +4,6 @@ "license": "See LICENSE file", "description": "The open source Zapier alternative. Build workflow automation without spending time and money.", "dependencies": { - "@apollo/client": "^3.6.9", "@casl/ability": "^6.5.0", "@casl/react": "^3.1.0", "@dagrejs/dagre": "^1.1.2", @@ -21,7 +20,6 @@ "@testing-library/user-event": "^12.1.10", "clipboard-copy": "^4.0.1", "compare-versions": "^4.1.3", - "graphql": "^15.6.0", "lodash": "^4.17.21", "luxon": "^2.3.1", "mui-color-input": "^2.0.0", diff --git a/packages/web/src/components/AccountDropdownMenu/index.jsx b/packages/web/src/components/AccountDropdownMenu/index.jsx index 4c69a8be..0bfb2ad7 100644 --- a/packages/web/src/components/AccountDropdownMenu/index.jsx +++ b/packages/web/src/components/AccountDropdownMenu/index.jsx @@ -6,11 +6,11 @@ import Menu from '@mui/material/Menu'; import { Link } from 'react-router-dom'; import Can from 'components/Can'; -import apolloClient from 'graphql/client'; import * as URLS from 'config/urls'; import useAuthentication from 'hooks/useAuthentication'; import useFormatMessage from 'hooks/useFormatMessage'; import useRevokeAccessToken from 'hooks/useRevokeAccessToken'; + function AccountDropdownMenu(props) { const formatMessage = useFormatMessage(); const authentication = useAuthentication(); @@ -23,7 +23,6 @@ function AccountDropdownMenu(props) { await revokeAccessTokenMutation.mutateAsync(); authentication.removeToken(); - await apolloClient.clearStore(); onClose(); navigate(URLS.LOGIN); }; diff --git a/packages/web/src/components/AdminApplicationAuthClientDialog/index.jsx b/packages/web/src/components/AdminApplicationAuthClientDialog/index.jsx index 9172bc1b..2a0aec33 100644 --- a/packages/web/src/components/AdminApplicationAuthClientDialog/index.jsx +++ b/packages/web/src/components/AdminApplicationAuthClientDialog/index.jsx @@ -7,7 +7,6 @@ import DialogContent from '@mui/material/DialogContent'; import DialogContentText from '@mui/material/DialogContentText'; import DialogTitle from '@mui/material/DialogTitle'; import CircularProgress from '@mui/material/CircularProgress'; -import { ApolloError } from '@apollo/client'; import { FieldPropType } from 'propTypes/propTypes'; import useFormatMessage from 'hooks/useFormatMessage'; @@ -89,7 +88,9 @@ function AdminApplicationAuthClientDialog(props) { } AdminApplicationAuthClientDialog.propTypes = { - error: PropTypes.instanceOf(ApolloError), + error: PropTypes.shape({ + message: PropTypes.string, + }), onClose: PropTypes.func.isRequired, title: PropTypes.string.isRequired, loading: PropTypes.bool.isRequired, diff --git a/packages/web/src/components/ApolloProvider/index.jsx b/packages/web/src/components/ApolloProvider/index.jsx deleted file mode 100644 index 2f74988a..00000000 --- a/packages/web/src/components/ApolloProvider/index.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import { ApolloProvider as BaseApolloProvider } from '@apollo/client'; -import * as React from 'react'; - -import { mutateAndGetClient } from 'graphql/client'; -import useAuthentication from 'hooks/useAuthentication'; -import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; - -const ApolloProvider = (props) => { - const enqueueSnackbar = useEnqueueSnackbar(); - const authentication = useAuthentication(); - - const onError = React.useCallback( - (message) => { - enqueueSnackbar(message, { - variant: 'error', - SnackbarProps: { - 'data-test': 'snackbar-error', - }, - }); - }, - [enqueueSnackbar], - ); - - const client = React.useMemo(() => { - return mutateAndGetClient({ - onError, - token: authentication.token, - }); - }, [onError, authentication]); - - return ; -}; - -export default ApolloProvider; diff --git a/packages/web/src/components/DeleteAccountDialog/index.ee.jsx b/packages/web/src/components/DeleteAccountDialog/index.ee.jsx index cd5354a5..59fa55ab 100644 --- a/packages/web/src/components/DeleteAccountDialog/index.ee.jsx +++ b/packages/web/src/components/DeleteAccountDialog/index.ee.jsx @@ -4,7 +4,6 @@ import { useNavigate } from 'react-router-dom'; import * as URLS from 'config/urls'; import ConfirmationDialog from 'components/ConfirmationDialog'; -import apolloClient from 'graphql/client'; import useAuthentication from 'hooks/useAuthentication'; import useFormatMessage from 'hooks/useFormatMessage'; import useCurrentUser from 'hooks/useCurrentUser'; @@ -27,8 +26,6 @@ function DeleteAccountDialog(props) { authentication.removeToken(); - await apolloClient.clearStore(); - navigate(URLS.LOGIN); }, [deleteCurrentUser, authentication, navigate]); diff --git a/packages/web/src/components/EditorNew/EditorNew.jsx b/packages/web/src/components/EditorNew/EditorNew.jsx index 89e655c4..fc7a5589 100644 --- a/packages/web/src/components/EditorNew/EditorNew.jsx +++ b/packages/web/src/components/EditorNew/EditorNew.jsx @@ -1,5 +1,4 @@ import { useEffect, useCallback, createContext, useRef, useState } from 'react'; -import { useMutation } from '@apollo/client'; import { useQueryClient } from '@tanstack/react-query'; import { FlowPropType } from 'propTypes/propTypes'; import ReactFlow, { useNodesState, useEdgesState } from 'reactflow'; diff --git a/packages/web/src/components/SignUpForm/index.ee.jsx b/packages/web/src/components/SignUpForm/index.ee.jsx index a9f140c2..33ab7ab8 100644 --- a/packages/web/src/components/SignUpForm/index.ee.jsx +++ b/packages/web/src/components/SignUpForm/index.ee.jsx @@ -1,6 +1,5 @@ import * as React from 'react'; import { useNavigate } from 'react-router-dom'; -import { useMutation } from '@apollo/client'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import LoadingButton from '@mui/lab/LoadingButton'; diff --git a/packages/web/src/config/app.js b/packages/web/src/config/app.js index 1a314640..1cb2466c 100644 --- a/packages/web/src/config/app.js +++ b/packages/web/src/config/app.js @@ -16,7 +16,6 @@ const computeUrl = (url, backendUrl) => { const config = { baseUrl: process.env.REACT_APP_BASE_URL, - graphqlUrl: computeUrl('/graphql', backendUrl), restApiUrl: computeUrl('/api', backendUrl), supportEmailAddress: 'support@automatisch.io', }; diff --git a/packages/web/src/graphql/cache.js b/packages/web/src/graphql/cache.js deleted file mode 100644 index 5d44dc73..00000000 --- a/packages/web/src/graphql/cache.js +++ /dev/null @@ -1,13 +0,0 @@ -import { InMemoryCache } from '@apollo/client'; -const cache = new InMemoryCache({ - typePolicies: { - App: { - keyFields: ['key'], - }, - Mutation: { - mutationType: true, - fields: {}, - }, - }, -}); -export default cache; diff --git a/packages/web/src/graphql/client.js b/packages/web/src/graphql/client.js deleted file mode 100644 index cbd2ee1b..00000000 --- a/packages/web/src/graphql/client.js +++ /dev/null @@ -1,31 +0,0 @@ -import { ApolloClient } from '@apollo/client'; - -import cache from './cache'; -import createLink from './link'; -import appConfig from 'config/app'; - -const client = new ApolloClient({ - cache, - link: createLink({ uri: appConfig.graphqlUrl }), - defaultOptions: { - watchQuery: { - fetchPolicy: 'cache-and-network', - }, - }, -}); - -export function mutateAndGetClient(options) { - const { onError, token } = options; - - const link = createLink({ - uri: appConfig.graphqlUrl, - token, - onError, - }); - - client.setLink(link); - - return client; -} - -export default client; diff --git a/packages/web/src/graphql/link.js b/packages/web/src/graphql/link.js deleted file mode 100644 index 7e5d3c1d..00000000 --- a/packages/web/src/graphql/link.js +++ /dev/null @@ -1,46 +0,0 @@ -import { HttpLink, from } from '@apollo/client'; -import { onError } from '@apollo/client/link/error'; -import { setItem } from 'helpers/storage'; -import * as URLS from 'config/urls'; -const createHttpLink = (options) => { - const { uri, token } = options; - const headers = { - authorization: token, - }; - return new HttpLink({ uri, headers }); -}; -const NOT_AUTHORISED = 'Not Authorised!'; -const createErrorLink = (callback) => - onError(({ graphQLErrors, networkError, operation }) => { - const context = operation.getContext(); - const autoSnackbar = context.autoSnackbar ?? true; - if (graphQLErrors) - graphQLErrors.forEach(({ message, locations, path }) => { - if (autoSnackbar) { - callback?.(message); - } - console.error( - `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`, - ); - if (message === NOT_AUTHORISED) { - setItem('token', ''); - if (window.location.pathname !== URLS.LOGIN) { - window.location.href = URLS.LOGIN; - } - } - }); - if (networkError) { - if (autoSnackbar) { - callback?.(networkError.toString()); - } - console.error(`[Network error]: ${networkError}`); - } - }); - -const noop = () => {}; -const createLink = (options) => { - const { uri, onError = noop, token } = options; - const httpOptions = { uri, token }; - return from([createErrorLink(onError), createHttpLink(httpOptions)]); -}; -export default createLink; diff --git a/packages/web/src/graphql/pagination.js b/packages/web/src/graphql/pagination.js deleted file mode 100644 index 3dd0a522..00000000 --- a/packages/web/src/graphql/pagination.js +++ /dev/null @@ -1,32 +0,0 @@ -const makeEmptyData = () => { - return { - edges: [], - pageInfo: { - currentPage: 1, - totalPages: 1, - }, - }; -}; -function offsetLimitPagination(keyArgs = false) { - return { - keyArgs, - merge(existing, incoming, { args }) { - if (!existing) { - existing = makeEmptyData(); - } - if (!incoming || incoming === null) return existing; - const existingEdges = existing?.edges || []; - const incomingEdges = incoming.edges || []; - if (args) { - const newEdges = [...existingEdges, ...incomingEdges]; - return { - pageInfo: incoming.pageInfo, - edges: newEdges, - }; - } else { - return existing; - } - }, - }; -} -export default offsetLimitPagination; diff --git a/packages/web/src/graphql/queries/get-dynamic-fields.js b/packages/web/src/graphql/queries/get-dynamic-fields.js deleted file mode 100644 index 1be20681..00000000 --- a/packages/web/src/graphql/queries/get-dynamic-fields.js +++ /dev/null @@ -1,69 +0,0 @@ -import { gql } from '@apollo/client'; -export const GET_DYNAMIC_FIELDS = gql` - query GetDynamicFields( - $stepId: String! - $key: String! - $parameters: JSONObject - ) { - getDynamicFields(stepId: $stepId, key: $key, parameters: $parameters) { - label - key - type - required - description - variables - dependsOn - value - options { - label - value - } - source { - type - name - arguments { - name - value - } - } - additionalFields { - type - name - arguments { - name - value - } - } - fields { - label - key - type - required - description - variables - value - dependsOn - options { - label - value - } - source { - type - name - arguments { - name - value - } - } - additionalFields { - type - name - arguments { - name - value - } - } - } - } - } -`; diff --git a/packages/web/src/index.jsx b/packages/web/src/index.jsx index 608e89d0..8c03da02 100644 --- a/packages/web/src/index.jsx +++ b/packages/web/src/index.jsx @@ -3,7 +3,6 @@ import { Settings } from 'luxon'; import ThemeProvider from 'components/ThemeProvider'; import IntlProvider from 'components/IntlProvider'; -import ApolloProvider from 'components/ApolloProvider'; import SnackbarProvider from 'components/SnackbarProvider'; import MetadataProvider from 'components/MetadataProvider'; import { AuthenticationProvider } from 'contexts/Authentication'; @@ -23,13 +22,11 @@ root.render( - - - - {routes} - - - + + + {routes} + + diff --git a/yarn.lock b/yarn.lock index b76da33b..ca62a206 100644 --- a/yarn.lock +++ b/yarn.lock @@ -134,42 +134,6 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@apollo/client@^3.6.9": - version "3.6.9" - resolved "https://registry.npmjs.org/@apollo/client/-/client-3.6.9.tgz" - integrity sha512-Y1yu8qa2YeaCUBVuw08x8NHenFi0sw2I3KCu7Kw9mDSu86HmmtHJkCAifKVrN2iPgDTW/BbP3EpSV8/EQCcxZA== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - "@wry/context" "^0.6.0" - "@wry/equality" "^0.5.0" - "@wry/trie" "^0.3.0" - graphql-tag "^2.12.6" - hoist-non-react-statics "^3.3.2" - optimism "^0.16.1" - prop-types "^15.7.2" - symbol-observable "^4.0.0" - ts-invariant "^0.10.3" - tslib "^2.3.0" - zen-observable-ts "^1.2.5" - -"@apollo/client@~3.2.5 || ~3.3.0 || ~3.4.0": - version "3.4.17" - resolved "https://registry.npmjs.org/@apollo/client/-/client-3.4.17.tgz" - integrity sha512-MDt2rwMX1GqodiVEKJqmDmAz8xr0qJmq5PdWeIt0yDaT4GOkKYWZiWkyfhfv3raTk8PyJvbsNG9q2CqmUrlGfg== - dependencies: - "@graphql-typed-document-node/core" "^3.0.0" - "@wry/context" "^0.6.0" - "@wry/equality" "^0.5.0" - "@wry/trie" "^0.3.0" - graphql-tag "^2.12.3" - hoist-non-react-statics "^3.3.2" - optimism "^0.16.1" - prop-types "^15.7.2" - symbol-observable "^4.0.0" - ts-invariant "^0.9.0" - tslib "^2.3.0" - zen-observable-ts "~1.1.0" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": version "7.16.7" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" @@ -1320,13 +1284,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.5": - version "7.17.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" - integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/runtime@^7.17.8": version "7.17.9" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz" @@ -1871,89 +1828,6 @@ resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz" integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== -"@graphql-tools/batch-execute@^8.3.2": - version "8.3.2" - resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.3.2.tgz" - integrity sha512-ICWqM+MvEkIPHm18Q0cmkvm134zeQMomBKmTRxyxMNhL/ouz6Nqld52/brSlaHnzA3fczupeRJzZ0YatruGBcQ== - dependencies: - "@graphql-tools/utils" "^8.6.2" - dataloader "2.0.0" - tslib "~2.3.0" - value-or-promise "1.0.11" - -"@graphql-tools/delegate@^8.5.1": - version "8.5.1" - resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-8.5.1.tgz" - integrity sha512-/YPmVxitt57F8sH50pnfXASzOOjEfaUDkX48eF5q6f16+JBncej2zeu+Zm2c68q8MbIxhPlEGfpd0QZeqTvAxw== - dependencies: - "@graphql-tools/batch-execute" "^8.3.2" - "@graphql-tools/schema" "^8.3.2" - "@graphql-tools/utils" "^8.6.2" - dataloader "2.0.0" - graphql-executor "0.0.18" - tslib "~2.3.0" - value-or-promise "1.0.11" - -"@graphql-tools/graphql-file-loader@^7.3.4": - version "7.3.4" - resolved "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.3.4.tgz" - integrity sha512-Q0/YtDq0APR6syRclsQMNguWKRlchd8nFTOpLhfc7Xeiy21VhEEi4Ik+quRySfb7ubDfJGhiUq4MQW43FhWJvg== - dependencies: - "@graphql-tools/import" "^6.6.6" - "@graphql-tools/utils" "^8.6.2" - globby "^11.0.3" - tslib "~2.3.0" - unixify "^1.0.0" - -"@graphql-tools/import@^6.6.6": - version "6.6.6" - resolved "https://registry.npmjs.org/@graphql-tools/import/-/import-6.6.6.tgz" - integrity sha512-a0aVajxqu1MsL8EwavA44Osw20lBOIhq8IM2ZIHFPP62cPAcOB26P+Sq57DHMsSyX5YQ0ab9XPM2o4e1dQhs0w== - dependencies: - "@graphql-tools/utils" "8.6.2" - resolve-from "5.0.0" - tslib "~2.3.0" - -"@graphql-tools/load@^7.5.2": - version "7.5.2" - resolved "https://registry.npmjs.org/@graphql-tools/load/-/load-7.5.2.tgz" - integrity sha512-URPqVP77mYxdZxT895DzrWf2C23S3yC/oAmXD4D4YlxR5eVVH/fxu0aZR78WcEKF331fWSiFwWy9j7BZWvkj7g== - dependencies: - "@graphql-tools/schema" "8.3.2" - "@graphql-tools/utils" "^8.6.2" - p-limit "3.1.0" - tslib "~2.3.0" - -"@graphql-tools/merge@^8.2.3": - version "8.2.3" - resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.3.tgz" - integrity sha512-XCSmL6/Xg8259OTWNp69B57CPWiVL69kB7pposFrufG/zaAlI9BS68dgzrxmmSqZV5ZHU4r/6Tbf6fwnEJGiSw== - dependencies: - "@graphql-tools/utils" "^8.6.2" - tslib "~2.3.0" - -"@graphql-tools/schema@8.3.2", "@graphql-tools/schema@^8.2.0", "@graphql-tools/schema@^8.3.2": - version "8.3.2" - resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.2.tgz" - integrity sha512-77feSmIuHdoxMXRbRyxE8rEziKesd/AcqKV6fmxe7Zt+PgIQITxNDew2XJJg7qFTMNM43W77Ia6njUSBxNOkwg== - dependencies: - "@graphql-tools/merge" "^8.2.3" - "@graphql-tools/utils" "^8.6.2" - tslib "~2.3.0" - value-or-promise "1.0.11" - -"@graphql-tools/utils@8.6.2", "@graphql-tools/utils@^8.6.2": - version "8.6.2" - resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.2.tgz" - integrity sha512-x1DG0cJgpJtImUlNE780B/dfp8pxvVxOD6UeykFH5rHes26S4kGokbgU8F1IgrJ1vAPm/OVBHtd2kicTsPfwdA== - dependencies: - tslib "~2.3.0" - -"@graphql-typed-document-node/core@^3.0.0", "@graphql-typed-document-node/core@^3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz" - integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== - "@hookform/resolvers@^2.8.8": version "2.8.8" resolved "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.8.8.tgz" @@ -4538,16 +4412,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yup@0.29.11": - version "0.29.11" - resolved "https://registry.npmjs.org/@types/yup/-/yup-0.29.11.tgz" - integrity sha512-9cwk3c87qQKZrT251EDoibiYRILjCmxBvvcb4meofCmx1vdnNcR9gyildy5vOHASpOKMsn42CugxUvcwK5eu1g== - -"@types/zen-observable@0.8.3": - version "0.8.3" - resolved "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz" - integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== - "@typescript-eslint/eslint-plugin@^5.5.0": version "5.10.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz" @@ -5088,27 +4952,6 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" -"@wry/context@^0.6.0": - version "0.6.1" - resolved "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz" - integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== - dependencies: - tslib "^2.3.0" - -"@wry/equality@^0.5.0": - version "0.5.2" - resolved "https://registry.npmjs.org/@wry/equality/-/equality-0.5.2.tgz" - integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA== - dependencies: - tslib "^2.3.0" - -"@wry/trie@^0.3.0": - version "0.3.1" - resolved "https://registry.npmjs.org/@wry/trie/-/trie-0.3.1.tgz" - integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw== - dependencies: - tslib "^2.3.0" - "@xmldom/xmldom@0.8.7": version "0.8.7" resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.7.tgz" @@ -5152,7 +4995,7 @@ abbrev@^2.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== -accepts@^1.3.7, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -6110,11 +5953,6 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -bytes@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz" - integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== - bytes@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" @@ -6718,7 +6556,7 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@1.0.4, content-type@^1.0.4, content-type@~1.0.4: +content-type@1.0.4, content-type@~1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== @@ -7248,11 +7086,6 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -dataloader@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz" - integrity sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ== - dateformat@^3.0.0: version "3.0.3" resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz" @@ -8563,16 +8396,6 @@ express-basic-auth@^1.2.1: dependencies: basic-auth "^2.0.1" -express-graphql@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/express-graphql/-/express-graphql-0.12.0.tgz" - integrity sha512-DwYaJQy0amdy3pgNtiTDuGGM2BLdj+YO2SgbKoLliCfuHv3VVTt7vNG/ZqK2hRYjtYHE2t2KB705EU94mE64zg== - dependencies: - accepts "^1.3.7" - content-type "^1.0.4" - http-errors "1.8.0" - raw-body "^2.4.1" - express@4.17.3, express@^4.17.1: version "4.17.3" resolved "https://registry.npmjs.org/express/-/express-4.17.3.tgz" @@ -9315,7 +9138,7 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4, globby@^11.1.0: +globby@^11.0.1, globby@^11.0.2, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -9354,50 +9177,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== -graphql-executor@0.0.18: - version "0.0.18" - resolved "https://registry.npmjs.org/graphql-executor/-/graphql-executor-0.0.18.tgz" - integrity sha512-upUSl7tfZCZ5dWG1XkOvpG70Yk3duZKcCoi/uJso4WxJVT6KIrcK4nZ4+2X/hzx46pL8wAukgYHY6iNmocRN+g== - -graphql-middleware@^6.1.15: - version "6.1.15" - resolved "https://registry.npmjs.org/graphql-middleware/-/graphql-middleware-6.1.15.tgz" - integrity sha512-JiLuIM48EE3QLcr79K0VCCHqMt6c23esLlkZv2Nr9a/yHnv6eU9DKV9eXARl+wV9m4LkT9ZCg4cIamIa9vPidQ== - dependencies: - "@graphql-tools/delegate" "^8.5.1" - "@graphql-tools/schema" "^8.3.2" - -graphql-shield@^7.5.0: - version "7.5.0" - resolved "https://registry.npmjs.org/graphql-shield/-/graphql-shield-7.5.0.tgz" - integrity sha512-T1A6OreOe/dHDk/1Qg3AHCrKLmTkDJ3fPFGYpSOmUbYXyDnjubK4J5ab5FjHdKHK5fWQRZNTvA0SrBObYsyfaw== - dependencies: - "@types/yup" "0.29.11" - object-hash "^2.0.3" - yup "^0.31.0" - -graphql-tag@^2.12.3, graphql-tag@^2.12.6: - version "2.12.6" - resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql-tools@^8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/graphql-tools/-/graphql-tools-8.2.0.tgz" - integrity sha512-9axT/0exEzVCk+vMPykOPannlrA4VQNo6nuWgh25IJ5arPf92OKxvjSHAbm7dQIFmcWxE0hVvyD2rWHjDqZCgQ== - dependencies: - "@graphql-tools/schema" "^8.2.0" - tslib "~2.3.0" - optionalDependencies: - "@apollo/client" "~3.2.5 || ~3.3.0 || ~3.4.0" - -graphql@^15.6.0: - version "15.8.0" - resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" - integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== - gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" @@ -9617,17 +9396,6 @@ http-errors@1.7.3: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@1.8.0: - version "1.8.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz" - integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-errors@1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" @@ -11239,7 +11007,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@^4.17.11, lodash-es@^4.17.21: +lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== @@ -12244,13 +12012,6 @@ normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -12440,7 +12201,7 @@ object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-hash@^2.0.3, object-hash@^2.2.0: +object-hash@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== @@ -12591,14 +12352,6 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -optimism@^0.16.1: - version "0.16.1" - resolved "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz" - integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== - dependencies: - "@wry/context" "^0.6.0" - "@wry/trie" "^0.3.0" - optionator@^0.8.1: version "0.8.3" resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" @@ -12651,13 +12404,6 @@ p-finally@^1.0.0: resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-limit@3.1.0, p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" @@ -12672,6 +12418,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-limit@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" @@ -14030,16 +13783,6 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz" - integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== - dependencies: - bytes "3.1.1" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-body@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" @@ -14565,11 +14308,6 @@ relateurl@^0.2.7: resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - remove-trailing-slash@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz" @@ -14634,16 +14372,16 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@5.0.0, resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-url-loader@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz" @@ -15842,11 +15580,6 @@ svgo@^2.7.0: picocolors "^1.0.0" stable "^0.1.8" -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" @@ -16207,20 +15940,6 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.2.1.tgz#f716c7e027494629485b21c0df6180f4d08f5e8b" integrity sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA== -ts-invariant@^0.10.3: - version "0.10.3" - resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz" - integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== - dependencies: - tslib "^2.1.0" - -ts-invariant@^0.9.0: - version "0.9.4" - resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.9.4.tgz" - integrity sha512-63jtX/ZSwnUNi/WhXjnK8kz4cHHpYS60AnmA6ixz17l7E12a5puCWFlNpkne5Rl0J8TBPVHpGjsj4fxs8ObVLQ== - dependencies: - tslib "^2.1.0" - tsconfig-paths@^3.12.0: version "3.12.0" resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz" @@ -16236,7 +15955,7 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@~2.3.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== @@ -16442,13 +16161,6 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unixify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz" - integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA= - dependencies: - normalize-path "^2.1.1" - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" @@ -16589,11 +16301,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -value-or-promise@1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz" - integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== - vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" @@ -17436,17 +17143,6 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -yup@^0.31.0: - version "0.31.1" - resolved "https://registry.npmjs.org/yup/-/yup-0.31.1.tgz" - integrity sha512-Lf6648jDYOWR75IlWkVfwesPyW6oj+50NpxlKvsQlpPsB8eI+ndI7b4S1VrwbmeV9hIZDu1MzrlIL4W+gK1jPw== - dependencies: - "@babel/runtime" "^7.10.5" - lodash "^4.17.20" - lodash-es "^4.17.11" - property-expr "^2.0.4" - toposort "^2.0.2" - yup@^0.32.11: version "0.32.11" resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" @@ -17460,26 +17156,6 @@ yup@^0.32.11: property-expr "^2.0.4" toposort "^2.0.2" -zen-observable-ts@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz" - integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== - dependencies: - zen-observable "0.8.15" - -zen-observable-ts@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz" - integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== - dependencies: - "@types/zen-observable" "0.8.3" - zen-observable "0.8.15" - -zen-observable@0.8.15: - version "0.8.15" - resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== - zustand@^4.4.1: version "4.5.2" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848" From de42eda65f559b68bfa10c693e7eb4a0e559f1e5 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Mon, 30 Sep 2024 12:04:37 +0000 Subject: [PATCH 2/3] refactor(helpers/authentication): remove obsolete arguments in isAuthenticated --- packages/backend/src/helpers/authentication.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/helpers/authentication.js b/packages/backend/src/helpers/authentication.js index ac7c3426..cfbb20d4 100644 --- a/packages/backend/src/helpers/authentication.js +++ b/packages/backend/src/helpers/authentication.js @@ -1,7 +1,7 @@ import User from '../models/user.js'; import AccessToken from '../models/access-token.js'; -export const isAuthenticated = async (_parent, _args, req) => { +export const isAuthenticated = async (req) => { const token = req.headers['authorization']; if (token == null) return false; @@ -40,7 +40,7 @@ export const isAuthenticated = async (_parent, _args, req) => { }; export const authenticateUser = async (request, response, next) => { - if (await isAuthenticated(null, null, request)) { + if (await isAuthenticated(request)) { next(); } else { return response.status(401).end(); From 115394ac8ca8b66906cfeb44ffa32a8202d1dfb2 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Mon, 30 Sep 2024 12:04:58 +0000 Subject: [PATCH 3/3] test(helpers/authentication): bring back applicable tests --- .../src/helpers/authentication.test.js | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 packages/backend/src/helpers/authentication.test.js diff --git a/packages/backend/src/helpers/authentication.test.js b/packages/backend/src/helpers/authentication.test.js new file mode 100644 index 00000000..1b5f1620 --- /dev/null +++ b/packages/backend/src/helpers/authentication.test.js @@ -0,0 +1,33 @@ +import { describe, it, expect } from 'vitest'; +import { isAuthenticated } from './authentication.js'; +import { createUser } from '../../test/factories/user.js'; +import createAuthTokenByUserId from '../helpers/create-auth-token-by-user-id.js'; + +describe('isAuthenticated', () => { + it('should return false if no token is provided', async () => { + const req = { headers: {} }; + expect(await isAuthenticated(req)).toBe(false); + }); + + it('should return false if token is invalid', async () => { + const req = { headers: { authorization: 'invalidToken' } }; + expect(await isAuthenticated(req)).toBe(false); + }); + + it('should return true if token is valid and there is a user', async () => { + const user = await createUser(); + const token = await createAuthTokenByUserId(user.id); + + const req = { headers: { authorization: token } }; + expect(await isAuthenticated(req)).toBe(true); + }); + + it('should return false if token is valid and but there is no user', async () => { + const user = await createUser(); + const token = await createAuthTokenByUserId(user.id); + await user.$query().delete(); + + const req = { headers: { authorization: token } }; + expect(await isAuthenticated(req)).toBe(false); + }); +});