web/satellite: remove Graphql dependency

This change removes unused GraphQL code and dependencies.

Issue: https://github.com/storj/storj/issues/6142

Change-Id: Ib2346c7a034f26b46af1bc6113e007b6adcbdd51
This commit is contained in:
Wilfred Asomani 2023-08-21 10:55:38 +00:00 committed by Storj Robot
parent fdd4be80bf
commit d10ce19f50
14 changed files with 23 additions and 414 deletions

View File

@ -8,7 +8,6 @@
"name": "storj-satellite",
"version": "0.1.0",
"dependencies": {
"@apollo/client": "3.7.14",
"@aws-sdk/client-s3": "3.379.1",
"@aws-sdk/lib-storage": "3.379.1",
"@aws-sdk/s3-request-presigner": "3.379.1",
@ -17,7 +16,6 @@
"@smithy/signature-v4": "2.0.1",
"bip39-english": "2.5.0",
"chart.js": "4.2.1",
"graphql": "15.3.0",
"pinia": "2.0.23",
"pretty-bytes": "5.6.0",
"qrcode": "1.5.3",
@ -72,47 +70,6 @@
"node": ">=0.10.0"
}
},
"node_modules/@apollo/client": {
"version": "3.7.14",
"resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.14.tgz",
"integrity": "sha512-BRvdkwq5PAXBkjXjboO12uksDm3nrZEqDi4xF97Fk3Mnaa0zDOEfJa7hoKTY9b9KA1EkeWv9BL3i7hSd4SfGBg==",
"dependencies": {
"@graphql-typed-document-node/core": "^3.1.1",
"@wry/context": "^0.7.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.2",
"prop-types": "^15.7.2",
"response-iterator": "^0.2.6",
"symbol-observable": "^4.0.0",
"ts-invariant": "^0.10.3",
"tslib": "^2.3.0",
"zen-observable-ts": "^1.2.5"
},
"peerDependencies": {
"graphql": "^14.0.0 || ^15.0.0 || ^16.0.0",
"graphql-ws": "^5.5.5",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
"subscriptions-transport-ws": "^0.9.0 || ^0.11.0"
},
"peerDependenciesMeta": {
"graphql-ws": {
"optional": true
},
"react": {
"optional": true
},
"react-dom": {
"optional": true
},
"subscriptions-transport-ws": {
"optional": true
}
}
},
"node_modules/@aws-crypto/crc32": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz",
@ -1640,14 +1597,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@graphql-typed-document-node/core": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz",
"integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==",
"peerDependencies": {
"graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
}
},
"node_modules/@hcaptcha/vue3-hcaptcha": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@hcaptcha/vue3-hcaptcha/-/vue3-hcaptcha-1.2.1.tgz",
@ -3269,39 +3218,6 @@
"@xtuc/long": "4.2.2"
}
},
"node_modules/@wry/context": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.3.tgz",
"integrity": "sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA==",
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@wry/equality": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.6.tgz",
"integrity": "sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA==",
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@wry/trie": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz",
"integrity": "sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==",
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@ -5658,28 +5574,6 @@
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
"dev": true
},
"node_modules/graphql": {
"version": "15.3.0",
"resolved": "https://registry.npmjs.org/graphql/-/graphql-15.3.0.tgz",
"integrity": "sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w==",
"engines": {
"node": ">= 10.x"
}
},
"node_modules/graphql-tag": {
"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"
},
"engines": {
"node": ">=10"
},
"peerDependencies": {
"graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
}
},
"node_modules/hard-rejection": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
@ -5785,14 +5679,6 @@
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
"dev": true
},
"node_modules/hoist-non-react-statics": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
"integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
"dependencies": {
"react-is": "^16.7.0"
}
},
"node_modules/hosted-git-info": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
@ -6693,22 +6579,6 @@
"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
"dev": true
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
"bin": {
"loose-envify": "cli.js"
}
},
"node_modules/loose-envify/node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"node_modules/loupe": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
@ -7146,14 +7016,6 @@
"integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
"dev": true
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-inspect": {
"version": "1.12.3",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
@ -7247,15 +7109,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/optimism": {
"version": "0.16.2",
"resolved": "https://registry.npmjs.org/optimism/-/optimism-0.16.2.tgz",
"integrity": "sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ==",
"dependencies": {
"@wry/context": "^0.7.0",
"@wry/trie": "^0.3.0"
}
},
"node_modules/optionator": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
@ -7816,16 +7669,6 @@
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
"dev": true
},
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
"node_modules/pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
@ -7921,11 +7764,6 @@
"safe-buffer": "^5.1.0"
}
},
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@ -8173,14 +8011,6 @@
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
"node_modules/response-iterator": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz",
"integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@ -9222,14 +9052,6 @@
"url": "https://opencollective.com/svgo"
}
},
"node_modules/symbol-observable": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
"integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==",
"engines": {
"node": ">=0.10"
}
},
"node_modules/symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
@ -9465,17 +9287,6 @@
"node": ">=8"
}
},
"node_modules/ts-invariant": {
"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"
},
"engines": {
"node": ">=8"
}
},
"node_modules/tsconfig-paths": {
"version": "3.14.2",
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
@ -10625,19 +10436,6 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/zen-observable": {
"version": "0.8.15",
"resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
"integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
},
"node_modules/zen-observable-ts": {
"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"
}
}
}
}

View File

@ -16,7 +16,6 @@
"test": "vitest run"
},
"dependencies": {
"@apollo/client": "3.7.14",
"@aws-sdk/client-s3": "3.379.1",
"@aws-sdk/lib-storage": "3.379.1",
"@aws-sdk/s3-request-presigner": "3.379.1",
@ -25,7 +24,6 @@
"@mdi/font": "7.0.96",
"bip39-english": "2.5.0",
"chart.js": "4.2.1",
"graphql": "15.3.0",
"pinia": "2.0.23",
"pretty-bytes": "5.6.0",
"qrcode": "1.5.3",

View File

@ -1,64 +0,0 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
import { GraphQLError } from 'graphql';
import { gql } from '@apollo/client/core';
import { apollo } from '@/utils/apollo';
/**
* BaseGql is a graphql utility which allows to perform queries and mutations.
*/
export class BaseGql {
/**
* performs qraphql query.
*
* @param query - qraphql query
* @param variables - variables to bind in query. null by default.
* @throws Error
*/
protected async query(query: string, variables: any = null): Promise<any> { // eslint-disable-line @typescript-eslint/no-explicit-any
const response = await apollo.query(
{
query: gql(query),
variables,
fetchPolicy: 'no-cache',
errorPolicy: 'all',
},
);
if (response.errors) {
throw new Error(this.combineErrors(response.errors));
}
return response;
}
/**
* performs qraphql mutation.
*
* @param query - qraphql query
* @param variables - variables to bind in query. null by default.
* @throws Error
*/
protected async mutate(query: string, variables: any = null): Promise<any> { // eslint-disable-line @typescript-eslint/no-explicit-any
const response = await apollo.mutate(
{
mutation: gql(query),
variables,
fetchPolicy: 'no-cache',
errorPolicy: 'all',
},
);
if (response.errors) {
throw new Error(this.combineErrors(response.errors));
}
return response;
}
private combineErrors(gqlError: readonly GraphQLError[]): string {
return gqlError.map(err => err).join('\n');
}
}

View File

@ -1,12 +1,11 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
import { BaseGql } from '@/api/baseGql';
import { ProjectInvitationItemModel, ProjectMember, ProjectMemberCursor, ProjectMembersApi, ProjectMembersPage } from '@/types/projectMembers';
import { HttpClient } from '@/utils/httpClient';
import { APIError } from '@/utils/error';
export class ProjectMembersApiGql extends BaseGql implements ProjectMembersApi {
export class ProjectMembersHttpApi implements ProjectMembersApi {
private readonly http: HttpClient = new HttpClient();
private readonly ROOT_PATH: string = '/api/v0/projects';

View File

@ -1,7 +1,6 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
import { BaseGql } from '@/api/baseGql';
import {
DataStamp,
Project,
@ -18,7 +17,7 @@ import { HttpClient } from '@/utils/httpClient';
import { Time } from '@/utils/time';
import { APIError } from '@/utils/error';
export class ProjectsApiGql extends BaseGql implements ProjectsApi {
export class ProjectsHttpApi implements ProjectsApi {
private readonly http: HttpClient = new HttpClient();
private readonly ROOT_PATH: string = '/api/v0/projects';
@ -115,27 +114,6 @@ export class ProjectsApiGql extends BaseGql implements ProjectsApi {
});
}
/**
* Delete project.
*
* @param projectId - project ID
* @throws Error
*/
public async delete(projectId: string): Promise<void> {
const query =
`mutation($projectId: String!) {
deleteProject(
publicId: $projectId
) {name}
}`;
const variables = {
projectId: projectId,
};
await this.mutate(query, variables);
}
/**
* Get project limits.
*

View File

@ -12,7 +12,7 @@ import {
ProjectMembersApi,
ProjectMembersPage,
} from '@/types/projectMembers';
import { ProjectMembersApiGql } from '@/api/projectMembers';
import { ProjectMembersHttpApi } from '@/api/projectMembers';
import { SortDirection } from '@/types/common';
import { DEFAULT_PAGE_LIMIT } from '@/types/pagination';
@ -26,7 +26,7 @@ export class ProjectMembersState {
export const useProjectMembersStore = defineStore('projectMembers', () => {
const state = reactive<ProjectMembersState>(new ProjectMembersState());
const api: ProjectMembersApi = new ProjectMembersApiGql();
const api: ProjectMembersApi = new ProjectMembersHttpApi();
async function inviteMembers(emails: string[], projectID: string): Promise<void> {
await api.invite(projectID, emails);

View File

@ -17,7 +17,7 @@ import {
ProjectInvitation,
ProjectInvitationResponse,
} from '@/types/projects';
import { ProjectsApiGql } from '@/api/projects';
import { ProjectsHttpApi } from '@/api/projects';
import { DEFAULT_PAGE_LIMIT } from '@/types/pagination';
const defaultSelectedProject = new Project('', '', '', '', '', true, 0);
@ -42,7 +42,7 @@ export class ProjectsState {
export const useProjectsStore = defineStore('projects', () => {
const state = reactive<ProjectsState>(new ProjectsState());
const api: ProjectsApi = new ProjectsApiGql();
const api: ProjectsApi = new ProjectsHttpApi();
async function getProjects(): Promise<Project[]> {
const projects = await api.get();

View File

@ -17,8 +17,7 @@ export enum ProjectMemberOrderBy {
}
/**
* ProjectMembersApi is a graphql implementation of ProjectMembers API.
* Exposes all ProjectMembers-related functionality
* ProjectMembersApi exposes all ProjectMembers-related functionality
*/
export interface ProjectMembersApi {

View File

@ -31,13 +31,6 @@ export interface ProjectsApi {
* @throws Error
*/
update(projectId: string, updateProjectFields: ProjectFields, updateProjectLimits: ProjectLimits): Promise<void>;
/**
* Delete project.
*
* @param projectId - project ID
* @throws Error
*/
delete(projectId: string): Promise<void>;
/**
* Get project limits.

View File

@ -1,91 +0,0 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
import { ApolloClient, ApolloLink, HttpLink, InMemoryCache, ServerError } from '@apollo/client/core';
import { setContext } from '@apollo/client/link/context';
import { onError } from '@apollo/client/link/error';
import { AuthHttpApi } from '@/api/auth';
import { AnalyticsErrorEventSource } from '@/utils/constants/analyticsEventNames';
import { useNotificationsStore } from '@/store/modules/notificationsStore';
/**
* Satellite url.
*/
const satelliteUrl = new HttpLink({
uri: import.meta.env.VITE_ENDPOINT_URL,
});
/**
* Adding additional headers.
*/
const authLink = setContext((_, { headers }) => {
// return the headers to the context so httpLink can read them
return {
headers: {
...headers,
},
};
});
/**
* Handling unauthorized error.
*/
const errorLink = onError(({ graphQLErrors, networkError, response }) => {
const notificationsStore = useNotificationsStore();
if (graphQLErrors?.length) {
const message = graphQLErrors.join('<br>');
let template = `
<p class="message-title">${message}</p>
`;
if (response && response['requestID']) {
template = `
${template}
<p class="message-footer">Request ID: ${response['requestID']}</p>
`;
}
notificationsStore.notifyError({ message: '', source: AnalyticsErrorEventSource.OVERALL_GRAPHQL_ERROR }, template);
}
if (networkError) {
const nError = (networkError as ServerError);
if (nError.statusCode === 401) {
new AuthHttpApi().logout();
notificationsStore.notifyError({ message: 'Session token expired', source: AnalyticsErrorEventSource.OVERALL_SESSION_EXPIRED_ERROR });
setTimeout(() => {
window.location.href = window.location.origin + '/login';
}, 2000);
} else {
const message = typeof nError.result === 'string' ? nError.result : nError.result.error;
let template = `<p class="message-title">${message}</p>`;
if (typeof nError.result !== 'string' && nError.result.requestID) {
template = `${template} <p class="message-footer">Request ID: ${nError.result.requestID}</p>`;
}
notificationsStore.notifyError({ message: '', source: AnalyticsErrorEventSource.OVERALL_GRAPHQL_ERROR }, template);
}
}
if (!(networkError && (networkError as ServerError).statusCode === 401)) {
return;
}
});
/**
* Combining error and satellite urls.
*/
const link = ApolloLink.from([
errorLink,
authLink.concat(satelliteUrl),
]);
/**
* Creating apollo client.
*/
export const apollo = new ApolloClient({
link: link,
cache: new InMemoryCache(),
connectToDevTools: true,
});

View File

@ -113,7 +113,6 @@ export enum AnalyticsErrorEventSource {
PROJECT_MEMBERS_HEADER = 'Project members page header',
PROJECT_MEMBERS_PAGE = 'Project members page',
OVERALL_APP_WRAPPER_ERROR = 'Overall app wrapper error',
OVERALL_GRAPHQL_ERROR = 'Overall graphQL error',
OVERALL_SESSION_EXPIRED_ERROR = 'Overall session expired error',
ALL_PROJECT_DASHBOARD = 'All projects dashboard error',
ONBOARDING_OVERVIEW_STEP = 'Onboarding Overview step error',

View File

@ -73,7 +73,7 @@ export class HttpClient {
* @param path
* @param body serialized JSON
*/
public async delete(path: string, body: string | null): Promise<Response> {
public async delete(path: string, body: string | null = null): Promise<Response> {
return this.sendJSON('DELETE', path, body);
}

View File

@ -4,7 +4,7 @@
import { describe, beforeEach, it, expect, vi } from 'vitest';
import { createPinia, setActivePinia } from 'pinia';
import { ProjectMembersApiGql } from '@/api/projectMembers';
import { ProjectMembersHttpApi } from '@/api/projectMembers';
import { SortDirection } from '@/types/common';
import { ProjectMember, ProjectMemberOrderBy, ProjectMembersPage } from '@/types/projectMembers';
import { Project } from '@/types/projects';
@ -35,7 +35,7 @@ describe('actions', () => {
testProjectMembersPage.totalCount = 1;
testProjectMembersPage.pageCount = 1;
vi.spyOn(ProjectMembersApiGql.prototype, 'get')
vi.spyOn(ProjectMembersHttpApi.prototype, 'get')
.mockImplementation(() => Promise.resolve(testProjectMembersPage));
await store.getProjectMembers(FIRST_PAGE, selectedProject.id);
@ -96,7 +96,7 @@ describe('actions', () => {
expect(store.state.page.projectMembers[0].isSelected()).toBe(true);
expect(store.state.selectedProjectMembersEmails.length).toBe(1);
vi.spyOn(ProjectMembersApiGql.prototype, 'get')
vi.spyOn(ProjectMembersHttpApi.prototype, 'get')
.mockImplementation(() => Promise.resolve(testProjectMembersPage));
await store.getProjectMembers(FIRST_PAGE, selectedProject.id);
@ -131,7 +131,7 @@ describe('actions', () => {
it('delete project members', async function () {
const store = useProjectMembersStore();
vi.spyOn(ProjectMembersApiGql.prototype, 'delete').mockReturnValue(Promise.resolve());
vi.spyOn(ProjectMembersHttpApi.prototype, 'delete').mockReturnValue(Promise.resolve());
try {
await store.deleteProjectMembers(selectedProject.id);
@ -144,7 +144,7 @@ describe('actions', () => {
it('delete project member throws error when api call fails', async function () {
const store = useProjectMembersStore();
vi.spyOn(ProjectMembersApiGql.prototype, 'delete').mockImplementation(() => {
vi.spyOn(ProjectMembersHttpApi.prototype, 'delete').mockImplementation(() => {
throw TEST_ERROR;
});
@ -165,7 +165,7 @@ describe('actions', () => {
it('fetch project members', async function () {
const store = useProjectMembersStore();
vi.spyOn(ProjectMembersApiGql.prototype, 'get').mockReturnValue(
vi.spyOn(ProjectMembersHttpApi.prototype, 'get').mockReturnValue(
Promise.resolve(new ProjectMembersPage(
[projectMember1],
[],
@ -191,7 +191,7 @@ describe('actions', () => {
it('fetch project members throws error when api call fails', async function () {
const store = useProjectMembersStore();
vi.spyOn(ProjectMembersApiGql.prototype, 'get').mockImplementation(() => {
vi.spyOn(ProjectMembersHttpApi.prototype, 'get').mockImplementation(() => {
throw TEST_ERROR;
});

View File

@ -4,7 +4,7 @@
import { vi } from 'vitest';
import { createPinia, setActivePinia } from 'pinia';
import { ProjectsApiGql } from '@/api/projects';
import { ProjectsHttpApi } from '@/api/projects';
import { Project, ProjectFields, ProjectLimits } from '@/types/projects';
import { useProjectsStore } from '@/store/modules/projectsStore';
@ -48,7 +48,7 @@ describe('actions', () => {
it('success fetch projects', async () => {
const store = useProjectsStore();
vi.spyOn(ProjectsApiGql.prototype, 'get').mockReturnValue(
vi.spyOn(ProjectsHttpApi.prototype, 'get').mockReturnValue(
Promise.resolve(projects),
);
@ -60,7 +60,7 @@ describe('actions', () => {
it('fetch throws an error when api call fails', async () => {
const store = useProjectsStore();
vi.spyOn(ProjectsApiGql.prototype, 'get').mockImplementation(() => { throw new Error(); });
vi.spyOn(ProjectsHttpApi.prototype, 'get').mockImplementation(() => { throw new Error(); });
try {
await store.getProjects();
@ -73,7 +73,7 @@ describe('actions', () => {
it('success create project', async () => {
const store = useProjectsStore();
vi.spyOn(ProjectsApiGql.prototype, 'create').mockReturnValue(
vi.spyOn(ProjectsHttpApi.prototype, 'create').mockReturnValue(
Promise.resolve(project),
);
@ -86,7 +86,7 @@ describe('actions', () => {
it('create throws an error when create api call fails', async () => {
const store = useProjectsStore();
vi.spyOn(ProjectsApiGql.prototype, 'create').mockImplementation(() => { throw new Error(); });
vi.spyOn(ProjectsHttpApi.prototype, 'create').mockImplementation(() => { throw new Error(); });
try {
await store.createProject(new ProjectFields());
@ -100,7 +100,7 @@ describe('actions', () => {
it('success update project name', async () => {
const store = useProjectsStore();
vi.spyOn(ProjectsApiGql.prototype, 'update').mockReturnValue(
vi.spyOn(ProjectsHttpApi.prototype, 'update').mockReturnValue(
Promise.resolve(),
);
@ -116,7 +116,7 @@ describe('actions', () => {
it('success update project description', async () => {
const store = useProjectsStore();
vi.spyOn(ProjectsApiGql.prototype, 'update').mockReturnValue(
vi.spyOn(ProjectsHttpApi.prototype, 'update').mockReturnValue(
Promise.resolve(),
);
@ -132,7 +132,7 @@ describe('actions', () => {
it('success get project limits', async () => {
const store = useProjectsStore();
vi.spyOn(ProjectsApiGql.prototype, 'getLimits').mockReturnValue(
vi.spyOn(ProjectsHttpApi.prototype, 'getLimits').mockReturnValue(
Promise.resolve(limits),
);