From 61a2caaae9f23a33dbe63a532fcbc9edc1f40262 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Mon, 26 Sep 2022 13:16:44 +0300 Subject: [PATCH] feat: batch commit actions improvements (list view support, batch delete in 'your commits') * feat(frontend): batch commit action support in list view * feat(frontend): batch delete in 'your commits' page * fix(server): authorizeResolver isPublic check always failed * fix(server): fixing tests --- packages/frontend/src/config/apolloConfig.ts | 2 +- .../frontend/src/graphql/generated/graphql.ts | 63 ++++-------- packages/frontend/src/helpers/typeHelpers.ts | 3 + .../components/common/CommitPreviewCard.vue | 34 ++++--- .../main/components/stream/ListItemCommit.vue | 26 ++++- .../commit/CommitMultiSelectToolbar.vue | 17 ++-- .../commit/CommitsBatchActionsDialog.vue | 31 ++++-- .../stream/composables/commitMultiActions.ts | 24 ++++- .../frontend/src/main/pages/TheCommits.vue | 58 +++++++++-- .../src/main/pages/stream/TheBranch.vue | 5 +- .../assets/comments/typedefs/comments.gql | 14 --- .../core/typedefs/branchesAndCommits.graphql | 30 ++---- .../tests/blobstorage.graph.spec.js | 5 +- .../comments/graph/resolvers/comments.js | 8 -- .../modules/core/graph/generated/graphql.ts | 96 +++++-------------- .../modules/core/graph/resolvers/commits.js | 27 ++++++ .../modules/core/graph/resolvers/streams.js | 8 +- packages/server/modules/core/loaders.ts | 14 ++- .../modules/core/repositories/commits.ts | 28 +++++- .../server/modules/core/services/commits.js | 6 +- .../services/streams/streamAccessService.js | 8 +- packages/server/modules/shared/index.js | 4 +- .../server/test/graphql/generated/graphql.ts | 47 +++------ 23 files changed, 303 insertions(+), 255 deletions(-) diff --git a/packages/frontend/src/config/apolloConfig.ts b/packages/frontend/src/config/apolloConfig.ts index bb8dc7365..f36943189 100644 --- a/packages/frontend/src/config/apolloConfig.ts +++ b/packages/frontend/src/config/apolloConfig.ts @@ -84,7 +84,7 @@ function createCache(): InMemoryCache { }, commits: { keyArgs: false, - merge: buildAbstractCollectionMergeFunction('CommitCollectionUser', { + merge: buildAbstractCollectionMergeFunction('CommitCollection', { checkIdentity: true }) }, diff --git a/packages/frontend/src/graphql/generated/graphql.ts b/packages/frontend/src/graphql/generated/graphql.ts index 1d9ff7fb7..1e667b1af 100644 --- a/packages/frontend/src/graphql/generated/graphql.ts +++ b/packages/frontend/src/graphql/generated/graphql.ts @@ -290,6 +290,15 @@ export type Commit = { parents?: Maybe>>; referencedObject: Scalars['String']; sourceApplication?: Maybe; + /** + * Will throw an authorization error if active user isn't authorized to see it, for example, + * if a stream isn't public and the user doesn't have the appropriate rights. + */ + stream: Stream; + /** @deprecated Use the stream field instead */ + streamId?: Maybe; + /** @deprecated Use the stream field instead */ + streamName?: Maybe; totalChildrenCount?: Maybe; }; @@ -305,42 +314,10 @@ export type CommitActivityArgs = { export type CommitCollection = { __typename?: 'CommitCollection'; cursor?: Maybe; - items?: Maybe>>; + items?: Maybe>; totalCount: Scalars['Int']; }; -export type CommitCollectionUser = { - __typename?: 'CommitCollectionUser'; - cursor?: Maybe; - items?: Maybe>>; - totalCount: Scalars['Int']; -}; - -export type CommitCollectionUserNode = { - __typename?: 'CommitCollectionUserNode'; - branchName?: Maybe; - /** - * The total number of comments for this commit. To actually get the comments, use the comments query and pass in a resource array consisting of of this commit's id. - * E.g., - * ``` - * query{ - * comments(streamId:"streamId" resources:[{resourceType: commit, resourceId:"commitId"}] ){ - * ... - * } - * ``` - */ - commentCount: Scalars['Int']; - createdAt?: Maybe; - id: Scalars['String']; - message?: Maybe; - parents?: Maybe>>; - referencedObject: Scalars['String']; - sourceApplication?: Maybe; - streamId?: Maybe; - streamName?: Maybe; - totalChildrenCount?: Maybe; -}; - export type CommitCreateInput = { branchName: Scalars['String']; message?: InputMaybe; @@ -1497,7 +1474,7 @@ export type User = { * Get commits authored by the user. If requested for another user, then only commits * from public streams will be returned. */ - commits?: Maybe; + commits?: Maybe; company?: Maybe; /** Returns the apps you have created. */ createdApps?: Maybe>>; @@ -1699,7 +1676,7 @@ export type StreamWithBranchQueryVariables = Exact<{ }>; -export type StreamWithBranchQuery = { __typename?: 'Query', stream?: { __typename?: 'Stream', id: string, name: string, role?: string | null, branch?: { __typename?: 'Branch', id: string, name: string, description?: string | null, commits?: { __typename?: 'CommitCollection', totalCount: number, cursor?: string | null, items?: Array<{ __typename?: 'Commit', id: string, authorName?: string | null, authorId?: string | null, authorAvatar?: string | null, sourceApplication?: string | null, message?: string | null, referencedObject: string, createdAt?: string | null, commentCount: number } | null> | null } | null } | null } | null }; +export type StreamWithBranchQuery = { __typename?: 'Query', stream?: { __typename?: 'Stream', id: string, name: string, role?: string | null, branch?: { __typename?: 'Branch', id: string, name: string, description?: string | null, commits?: { __typename?: 'CommitCollection', totalCount: number, cursor?: string | null, items?: Array<{ __typename?: 'Commit', id: string, authorName?: string | null, authorId?: string | null, authorAvatar?: string | null, sourceApplication?: string | null, message?: string | null, referencedObject: string, createdAt?: string | null, commentCount: number }> | null } | null } | null } | null }; export type BranchCreatedSubscriptionVariables = Exact<{ streamId: Scalars['String']; @@ -1857,14 +1834,14 @@ export type StreamCommitsQueryVariables = Exact<{ }>; -export type StreamCommitsQuery = { __typename?: 'Query', stream?: { __typename?: 'Stream', id: string, role?: string | null, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, authorId?: string | null, authorName?: string | null, authorAvatar?: string | null, createdAt?: string | null, message?: string | null, referencedObject: string, branchName?: string | null, sourceApplication?: string | null } | null> | null } | null } | null }; +export type StreamCommitsQuery = { __typename?: 'Query', stream?: { __typename?: 'Stream', id: string, role?: string | null, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, authorId?: string | null, authorName?: string | null, authorAvatar?: string | null, createdAt?: string | null, message?: string | null, referencedObject: string, branchName?: string | null, sourceApplication?: string | null }> | null } | null } | null }; export type StreamsQueryVariables = Exact<{ cursor?: InputMaybe; }>; -export type StreamsQuery = { __typename?: 'Query', streams?: { __typename?: 'StreamCollection', totalCount: number, cursor?: string | null, items?: Array<{ __typename?: 'Stream', id: string, name: string, description?: string | null, role?: string | null, isPublic: boolean, createdAt: string, updatedAt: string, commentCount: number, favoritedDate?: string | null, favoritesCount: number, collaborators: Array<{ __typename?: 'StreamCollaborator', id: string, name: string, company?: string | null, avatar?: string | null, role: string }>, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, createdAt?: string | null, message?: string | null, authorId?: string | null, branchName?: string | null, authorName?: string | null, authorAvatar?: string | null, referencedObject: string } | null> | null } | null, branches?: { __typename?: 'BranchCollection', totalCount: number } | null }> | null } | null }; +export type StreamsQuery = { __typename?: 'Query', streams?: { __typename?: 'StreamCollection', totalCount: number, cursor?: string | null, items?: Array<{ __typename?: 'Stream', id: string, name: string, description?: string | null, role?: string | null, isPublic: boolean, createdAt: string, updatedAt: string, commentCount: number, favoritedDate?: string | null, favoritesCount: number, collaborators: Array<{ __typename?: 'StreamCollaborator', id: string, name: string, company?: string | null, avatar?: string | null, role: string }>, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, createdAt?: string | null, message?: string | null, authorId?: string | null, branchName?: string | null, authorName?: string | null, authorAvatar?: string | null, referencedObject: string }> | null } | null, branches?: { __typename?: 'BranchCollection', totalCount: number } | null }> | null } | null }; export type CommonStreamFieldsFragment = { __typename?: 'Stream', id: string, name: string, description?: string | null, role?: string | null, isPublic: boolean, createdAt: string, updatedAt: string, commentCount: number, favoritedDate?: string | null, favoritesCount: number, collaborators: Array<{ __typename?: 'StreamCollaborator', id: string, name: string, company?: string | null, avatar?: string | null, role: string }>, commits?: { __typename?: 'CommitCollection', totalCount: number } | null, branches?: { __typename?: 'BranchCollection', totalCount: number } | null }; @@ -1909,7 +1886,7 @@ export type StreamFirstCommitQueryVariables = Exact<{ }>; -export type StreamFirstCommitQuery = { __typename?: 'Query', stream?: { __typename?: 'Stream', id: string, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, referencedObject: string } | null> | null } | null } | null }; +export type StreamFirstCommitQuery = { __typename?: 'Query', stream?: { __typename?: 'Stream', id: string, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, referencedObject: string }> | null } | null } | null }; export type StreamBranchFirstCommitQueryVariables = Exact<{ id: Scalars['String']; @@ -1917,7 +1894,7 @@ export type StreamBranchFirstCommitQueryVariables = Exact<{ }>; -export type StreamBranchFirstCommitQuery = { __typename?: 'Query', stream?: { __typename?: 'Stream', id: string, branch?: { __typename?: 'Branch', commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, referencedObject: string } | null> | null } | null } | null } | null }; +export type StreamBranchFirstCommitQuery = { __typename?: 'Query', stream?: { __typename?: 'Stream', id: string, branch?: { __typename?: 'Branch', commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, referencedObject: string }> | null } | null } | null } | null }; export type StreamSettingsQueryVariables = Exact<{ id: Scalars['String']; @@ -1940,24 +1917,24 @@ export type DeleteStreamMutationVariables = Exact<{ export type DeleteStreamMutation = { __typename?: 'Mutation', streamDelete: boolean }; -export type CommonUserFieldsFragment = { __typename?: 'User', id: string, email?: string | null, name?: string | null, bio?: string | null, company?: string | null, avatar?: string | null, verified?: boolean | null, hasPendingVerification?: boolean | null, profiles?: Record | null, role?: string | null, streams?: { __typename?: 'StreamCollection', totalCount: number } | null, commits?: { __typename?: 'CommitCollectionUser', totalCount: number, items?: Array<{ __typename?: 'CommitCollectionUserNode', id: string, createdAt?: string | null } | null> | null } | null }; +export type CommonUserFieldsFragment = { __typename?: 'User', id: string, email?: string | null, name?: string | null, bio?: string | null, company?: string | null, avatar?: string | null, verified?: boolean | null, hasPendingVerification?: boolean | null, profiles?: Record | null, role?: string | null, streams?: { __typename?: 'StreamCollection', totalCount: number } | null, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, createdAt?: string | null }> | null } | null }; export type UserFavoriteStreamsQueryVariables = Exact<{ cursor?: InputMaybe; }>; -export type UserFavoriteStreamsQuery = { __typename?: 'Query', user?: { __typename?: 'User', id: string, email?: string | null, name?: string | null, bio?: string | null, company?: string | null, avatar?: string | null, verified?: boolean | null, hasPendingVerification?: boolean | null, profiles?: Record | null, role?: string | null, favoriteStreams?: { __typename?: 'StreamCollection', totalCount: number, cursor?: string | null, items?: Array<{ __typename?: 'Stream', id: string, name: string, description?: string | null, role?: string | null, isPublic: boolean, createdAt: string, updatedAt: string, commentCount: number, favoritedDate?: string | null, favoritesCount: number, collaborators: Array<{ __typename?: 'StreamCollaborator', id: string, name: string, company?: string | null, avatar?: string | null, role: string }>, commits?: { __typename?: 'CommitCollection', totalCount: number } | null, branches?: { __typename?: 'BranchCollection', totalCount: number } | null }> | null } | null, streams?: { __typename?: 'StreamCollection', totalCount: number } | null, commits?: { __typename?: 'CommitCollectionUser', totalCount: number, items?: Array<{ __typename?: 'CommitCollectionUserNode', id: string, createdAt?: string | null } | null> | null } | null } | null }; +export type UserFavoriteStreamsQuery = { __typename?: 'Query', user?: { __typename?: 'User', id: string, email?: string | null, name?: string | null, bio?: string | null, company?: string | null, avatar?: string | null, verified?: boolean | null, hasPendingVerification?: boolean | null, profiles?: Record | null, role?: string | null, favoriteStreams?: { __typename?: 'StreamCollection', totalCount: number, cursor?: string | null, items?: Array<{ __typename?: 'Stream', id: string, name: string, description?: string | null, role?: string | null, isPublic: boolean, createdAt: string, updatedAt: string, commentCount: number, favoritedDate?: string | null, favoritesCount: number, collaborators: Array<{ __typename?: 'StreamCollaborator', id: string, name: string, company?: string | null, avatar?: string | null, role: string }>, commits?: { __typename?: 'CommitCollection', totalCount: number } | null, branches?: { __typename?: 'BranchCollection', totalCount: number } | null }> | null } | null, streams?: { __typename?: 'StreamCollection', totalCount: number } | null, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, createdAt?: string | null }> | null } | null } | null }; export type MainUserDataQueryVariables = Exact<{ [key: string]: never; }>; -export type MainUserDataQuery = { __typename?: 'Query', user?: { __typename?: 'User', id: string, email?: string | null, name?: string | null, bio?: string | null, company?: string | null, avatar?: string | null, verified?: boolean | null, hasPendingVerification?: boolean | null, profiles?: Record | null, role?: string | null, streams?: { __typename?: 'StreamCollection', totalCount: number } | null, commits?: { __typename?: 'CommitCollectionUser', totalCount: number, items?: Array<{ __typename?: 'CommitCollectionUserNode', id: string, createdAt?: string | null } | null> | null } | null } | null }; +export type MainUserDataQuery = { __typename?: 'Query', user?: { __typename?: 'User', id: string, email?: string | null, name?: string | null, bio?: string | null, company?: string | null, avatar?: string | null, verified?: boolean | null, hasPendingVerification?: boolean | null, profiles?: Record | null, role?: string | null, streams?: { __typename?: 'StreamCollection', totalCount: number } | null, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, createdAt?: string | null }> | null } | null } | null }; export type ExtraUserDataQueryVariables = Exact<{ [key: string]: never; }>; -export type ExtraUserDataQuery = { __typename?: 'Query', user?: { __typename?: 'User', totalOwnedStreamsFavorites: number, notificationPreferences: Record, id: string, email?: string | null, name?: string | null, bio?: string | null, company?: string | null, avatar?: string | null, verified?: boolean | null, hasPendingVerification?: boolean | null, profiles?: Record | null, role?: string | null, streams?: { __typename?: 'StreamCollection', totalCount: number } | null, commits?: { __typename?: 'CommitCollectionUser', totalCount: number, items?: Array<{ __typename?: 'CommitCollectionUserNode', id: string, createdAt?: string | null } | null> | null } | null } | null }; +export type ExtraUserDataQuery = { __typename?: 'Query', user?: { __typename?: 'User', totalOwnedStreamsFavorites: number, notificationPreferences: Record, id: string, email?: string | null, name?: string | null, bio?: string | null, company?: string | null, avatar?: string | null, verified?: boolean | null, hasPendingVerification?: boolean | null, profiles?: Record | null, role?: string | null, streams?: { __typename?: 'StreamCollection', totalCount: number } | null, commits?: { __typename?: 'CommitCollection', totalCount: number, items?: Array<{ __typename?: 'Commit', id: string, createdAt?: string | null }> | null } | null } | null }; export type UserSearchQueryVariables = Exact<{ query: Scalars['String']; diff --git a/packages/frontend/src/helpers/typeHelpers.ts b/packages/frontend/src/helpers/typeHelpers.ts index bdc679904..88f2f3007 100644 --- a/packages/frontend/src/helpers/typeHelpers.ts +++ b/packages/frontend/src/helpers/typeHelpers.ts @@ -1,6 +1,7 @@ import { ReactiveVar } from '@apollo/client/core' import { isUndefined } from 'lodash' import Vue, { VueConstructor } from 'vue' +import { LooseRequired } from 'vue/types/common' export type Nullable = T | null @@ -25,6 +26,8 @@ export type GetReactiveVarType> = V extends ReactiveV ? T : unknown +export type SetupProps

= Readonly> + // Copied from Vue typings & improved ergonomics export type CombinedVueInstance< Instance extends Vue = Vue, diff --git a/packages/frontend/src/main/components/common/CommitPreviewCard.vue b/packages/frontend/src/main/components/common/CommitPreviewCard.vue index 0f20aadf1..5992c9244 100644 --- a/packages/frontend/src/main/components/common/CommitPreviewCard.vue +++ b/packages/frontend/src/main/components/common/CommitPreviewCard.vue @@ -18,6 +18,7 @@ v-if="allowSelect" v-model="selectedState" dense + hide-details @change="onSelect" />

@@ -44,13 +45,13 @@
-
+
mdi-folder-outline - {{ commit.streamName }} + {{ streamName }}
@@ -85,6 +86,8 @@