From cea3314ab67bbfe7621fb0343a6e10c0cf792f7d Mon Sep 17 00:00:00 2001 From: Tanya Fomina Date: Sun, 24 Aug 2025 16:58:41 +0300 Subject: [PATCH 01/15] Add @allowAnon directive --- .../{requireAuth.ts => allowAnon.ts} | 35 +++++++++++++------ src/schema.ts | 7 ++-- src/typeDefs/billing.ts | 10 +++--- src/typeDefs/event.ts | 12 +++---- src/typeDefs/user.ts | 14 ++++---- src/typeDefs/userNotificationsMutations.ts | 4 +-- src/typeDefs/workspace.ts | 14 ++++---- 7 files changed, 55 insertions(+), 41 deletions(-) rename src/directives/{requireAuth.ts => allowAnon.ts} (61%) diff --git a/src/directives/requireAuth.ts b/src/directives/allowAnon.ts similarity index 61% rename from src/directives/requireAuth.ts rename to src/directives/allowAnon.ts index d5e903a0..7a24cc18 100644 --- a/src/directives/requireAuth.ts +++ b/src/directives/allowAnon.ts @@ -20,37 +20,50 @@ function checkUser(context: ResolverContextBase): void { } } -export default function requireAuthDirective(directiveName = 'requireAuth') { +export default function allowAnonDirective(directiveName = 'allowAnon') { return { - requireAuthDirectiveTypeDefs: ` + allowAnonDirectiveTypeDefs: ` """ - Access to the field only to authorized users + Allow access to the field to anonymous users """ directive @${directiveName} on FIELD_DEFINITION `, - requireAuthDirectiveTransformer: (schema: GraphQLSchema) => + allowAnonDirectiveTransformer: (schema: GraphQLSchema) => mapSchema(schema, { [MapperKind.OBJECT_FIELD]: (fieldConfig, fieldName) => { - const requireAuthDirective = getDirective(schema, fieldConfig, directiveName)?.[0]; + const allowAnonDirective = getDirective(schema, fieldConfig, directiveName)?.[0]; - if (requireAuthDirective) { + if (allowAnonDirective) { + /** Append flag isAnonAllowed to request context */ const { resolve = defaultFieldResolver, } = fieldConfig; - /** - * New field resolver - * @param resolverArgs - default GraphQL resolver args - */ fieldConfig.resolve = async function (...resolverArgs): UnknownGraphQLResolverResult { const [, , context] = resolverArgs; - checkUser(context); + context.isAnonAllowed = true; return resolve.apply(this, resolverArgs); }; + + return fieldConfig; } + const { + resolve = defaultFieldResolver, + } = fieldConfig; + + fieldConfig.resolve = async function (...resolverArgs): UnknownGraphQLResolverResult { + const [, , context] = resolverArgs; + + if (!context.isAnonAllowed) { + checkUser(context); + } + + return resolve.apply(this, resolverArgs); + }; + return fieldConfig; }, }), diff --git a/src/schema.ts b/src/schema.ts index faa679bf..0db41a77 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -6,7 +6,7 @@ import { mergeTypeDefs } from '@graphql-tools/merge'; import defaultValueDirective from './directives/defaultValue'; import validateDirective from './directives/validate'; import uploadImageDirective from './directives/uploadImageDirective'; -import requireAuthDirective from './directives/requireAuth'; +import allowAnonDirective from './directives/allowAnon'; import requireAdminDirective from './directives/requireAdmin'; import requireUserInWorkspaceDirective from './directives/requireUserInWorkspace'; @@ -14,7 +14,7 @@ const { renameFromDirectiveTypeDefs, renameFromDirectiveTransformer } = renameFr const { defaultValueDirectiveTypeDefs, defaultValueDirectiveTransformer } = defaultValueDirective(); const { validateDirectiveTypeDefs, validateDirectiveTransformer } = validateDirective(); const { uploadImageDirectiveTypeDefs, uploadImageDirectiveTransformer } = uploadImageDirective(); -const { requireAuthDirectiveTypeDefs, requireAuthDirectiveTransformer } = requireAuthDirective(); +const { allowAnonDirectiveTypeDefs, allowAnonDirectiveTransformer } = allowAnonDirective(); const { requireAdminDirectiveTypeDefs, requireAdminDirectiveTransformer } = requireAdminDirective(); const { requireUserInWorkspaceDirectiveTypeDefs, requireUserInWorkspaceDirectiveTransformer } = requireUserInWorkspaceDirective(); @@ -24,7 +24,7 @@ let schema = makeExecutableSchema({ defaultValueDirectiveTypeDefs, validateDirectiveTypeDefs, uploadImageDirectiveTypeDefs, - requireAuthDirectiveTypeDefs, + allowAnonDirectiveTypeDefs, requireAdminDirectiveTypeDefs, requireUserInWorkspaceDirectiveTypeDefs, ...typeDefs, @@ -37,6 +37,7 @@ schema = defaultValueDirectiveTransformer(schema); schema = validateDirectiveTransformer(schema); schema = uploadImageDirectiveTransformer(schema); schema = requireAuthDirectiveTransformer(schema); +schema = allowAnonDirectiveTransformer(schema); schema = requireAdminDirectiveTransformer(schema); schema = requireUserInWorkspaceDirectiveTransformer(schema); diff --git a/src/typeDefs/billing.ts b/src/typeDefs/billing.ts index 12b3bc0a..f277fbca 100644 --- a/src/typeDefs/billing.ts +++ b/src/typeDefs/billing.ts @@ -277,12 +277,12 @@ extend type Query { """ Get workspace billing history """ - businessOperations("Workspaces IDs" ids: [ID!] = []): [BusinessOperation!]! @requireAuth @requireAdmin + businessOperations("Workspaces IDs" ids: [ID!] = []): [BusinessOperation!]! @requireAdmin """ Prepare payment data before charge (GraphQL version of composePayment) """ - composePayment(input: ComposePaymentInput!): ComposePaymentResponse! @requireAuth + composePayment(input: ComposePaymentInput!): ComposePaymentResponse! } """ @@ -324,18 +324,18 @@ extend type Mutation { """ Remove card """ - removeCard(cardNumber: String!): Boolean! @requireAuth + removeCard(cardNumber: String!): Boolean! """ Mutation for processing payment with saved card """ payWithCard( input: PayWithCardInput! - ): PayWithCardResponse! @requireAuth + ): PayWithCardResponse! """ Returns JSON data with payment link and initiate card attach procedure """ - attachCard(language: String): BillingSession! @requireAuth + attachCard(language: String): BillingSession! } `; diff --git a/src/typeDefs/event.ts b/src/typeDefs/event.ts index a7990679..6f894f26 100644 --- a/src/typeDefs/event.ts +++ b/src/typeDefs/event.ts @@ -366,7 +366,7 @@ type Event { User's local timezone offset in minutes """ timezoneOffset: Int! = 0 - ): [ChartDataItem!]! @requireAuth + ): [ChartDataItem!]! } """ @@ -408,7 +408,7 @@ type Subscription { """ Sends new events from all user projects """ - eventOccurred: Event! @requireAuth + eventOccurred: Event! } """ @@ -480,14 +480,14 @@ type EventsMutations { """ updateAssignee( input: UpdateAssigneeInput! - ): UpdateAssigneeResponse! @requireAuth @requireUserInWorkspace + ): UpdateAssigneeResponse! @requireUserInWorkspace """ Remove an assignee from the selected event """ removeAssignee( input: RemoveAssigneeInput! - ): RemoveAssigneeResponse! @requireAuth @requireUserInWorkspace + ): RemoveAssigneeResponse! @requireUserInWorkspace } extend type Mutation { @@ -497,7 +497,7 @@ extend type Mutation { visitEvent( project: ID! id: ID! - ): Boolean! @requireAuth + ): Boolean! """ Mutation sets or unsets passed mark to event @@ -517,7 +517,7 @@ extend type Mutation { Mark to set """ mark: EventMark! - ): Boolean! @requireAuth + ): Boolean! """ Namespace that contains only mutations related to the events diff --git a/src/typeDefs/user.ts b/src/typeDefs/user.ts index 2d8aa25b..93b13b1a 100644 --- a/src/typeDefs/user.ts +++ b/src/typeDefs/user.ts @@ -90,7 +90,7 @@ export default gql` """ Returns authenticated user data """ - me: User @requireAuth + me: User } extend type Mutation { @@ -107,7 +107,7 @@ export default gql` UTM parameters """ utm: UtmInput - ): ${isE2E ? 'String!' : 'Boolean!'} + ): ${isE2E ? 'String!' : 'Boolean!'} @allowAnon """ Login user with provided email and password @@ -122,7 +122,7 @@ export default gql` User password """ password: String! @validate(notEmpty: true) - ): Tokens! + ): Tokens! @allowAnon """ Update user's tokens pair @@ -132,7 +132,7 @@ export default gql` Refresh token for getting new token pair """ refreshToken: String! - ): Tokens! + ): Tokens! @allowAnon """ Reset user's password @@ -142,7 +142,7 @@ export default gql` User email """ email: String! @validate(isEmail: true) - ): Boolean! + ): Boolean! @allowAnon """ Update user's profile @@ -162,7 +162,7 @@ export default gql` User image file """ image: Upload @uploadImage - ): Boolean! @requireAuth + ): Boolean! """ Change user password @@ -177,6 +177,6 @@ export default gql` New user password """ newPassword: String! @validate(notEmpty: true) - ): Boolean! @requireAuth + ): Boolean! } `; diff --git a/src/typeDefs/userNotificationsMutations.ts b/src/typeDefs/userNotificationsMutations.ts index 5fa1bc59..4145aa4e 100644 --- a/src/typeDefs/userNotificationsMutations.ts +++ b/src/typeDefs/userNotificationsMutations.ts @@ -32,7 +32,7 @@ export default gql` Channel data to update """ input: NotificationsChannelsInput! - ): changeUserNotificationsChannelResponse! @requireAuth + ): changeUserNotificationsChannelResponse! """ Toggle user notifications receive type active status @@ -42,6 +42,6 @@ export default gql` Receive type with its new is-enabled value """ input: ChangeUserNotificationsReceiveTypeInput! - ): changeUserNotificationsReceiveTypeResponse! @requireAuth + ): changeUserNotificationsReceiveTypeResponse! } `; diff --git a/src/typeDefs/workspace.ts b/src/typeDefs/workspace.ts index 045c4272..8cc24314 100644 --- a/src/typeDefs/workspace.ts +++ b/src/typeDefs/workspace.ts @@ -130,7 +130,7 @@ export default gql` Project(s) id(s) """ ids: [ID!] = [] - ): [Project!] @requireAuth + ): [Project!] } extend type Query { @@ -138,7 +138,7 @@ export default gql` Returns workspace(s) info If ids = [] returns all user's workspaces """ - workspaces("Workspace(s) id(s)" ids: [ID] = []): [Workspace] @requireAuth + workspaces("Workspace(s) id(s)" ids: [ID] = []): [Workspace] } extend type Mutation { @@ -160,7 +160,7 @@ export default gql` New workspace image """ image: Upload @uploadImage - ): Workspace! @requireAuth + ): Workspace! """ Invite user to workspace @@ -176,7 +176,7 @@ export default gql` id of the workspace to which the user is invited """ workspaceId: ID! - ): Boolean! @requireAuth + ): Boolean! """ Update workspace settings @@ -211,7 +211,7 @@ export default gql` Workspace invite hash from link """ inviteHash: String! - ): UpdateWorkspaceResponse! @requireAuth + ): UpdateWorkspaceResponse! """ Confirm invitation to workspace @@ -227,7 +227,7 @@ export default gql` Id of the workspace to which the user was invited """ workspaceId: ID! - ): UpdateWorkspaceResponse! @requireAuth + ): UpdateWorkspaceResponse! """ Grant admin permissions @@ -280,6 +280,6 @@ export default gql` Workspace ID """ workspaceId: ID! - ): Boolean! @requireAuth + ): Boolean! } `; From d34e6bbae5c541ccba45ada614bef4ac43dffaee Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 24 Aug 2025 14:02:24 +0000 Subject: [PATCH 02/15] Bump version up to 1.1.33 --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index ccec20d3..ab70df85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.32", + "version": "1.1.33", "main": "index.ts", "license": "UNLICENSED", "scripts": { @@ -44,8 +44,6 @@ "@types/debug": "^4.1.5", "@types/escape-html": "^1.0.0", "@types/graphql-upload": "^8.0.11", - "@types/lodash.clonedeep": "^4.5.9", - "@types/lodash.mergewith": "^4.6.9", "@types/jsonwebtoken": "^8.3.5", "@types/lodash.clonedeep": "^4.5.9", "@types/lodash.mergewith": "^4.6.9", From c85a37cc2ee4b6ab9cca48425b45cae8d1ba99a1 Mon Sep 17 00:00:00 2001 From: Tanya Fomina Date: Sun, 24 Aug 2025 17:20:23 +0300 Subject: [PATCH 03/15] Fix --- src/schema.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/schema.ts b/src/schema.ts index 0db41a77..e5bea169 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -36,7 +36,6 @@ schema = renameFromDirectiveTransformer(schema); schema = defaultValueDirectiveTransformer(schema); schema = validateDirectiveTransformer(schema); schema = uploadImageDirectiveTransformer(schema); -schema = requireAuthDirectiveTransformer(schema); schema = allowAnonDirectiveTransformer(schema); schema = requireAdminDirectiveTransformer(schema); schema = requireUserInWorkspaceDirectiveTransformer(schema); From 062a5e7271657c38591f911152c6cb337657d1f0 Mon Sep 17 00:00:00 2001 From: Tanya Fomina Date: Sun, 24 Aug 2025 19:03:12 +0300 Subject: [PATCH 04/15] Upd --- src/schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schema.ts b/src/schema.ts index e5bea169..562e93c0 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -36,8 +36,8 @@ schema = renameFromDirectiveTransformer(schema); schema = defaultValueDirectiveTransformer(schema); schema = validateDirectiveTransformer(schema); schema = uploadImageDirectiveTransformer(schema); -schema = allowAnonDirectiveTransformer(schema); schema = requireAdminDirectiveTransformer(schema); +schema = allowAnonDirectiveTransformer(schema); schema = requireUserInWorkspaceDirectiveTransformer(schema); export default schema; From dfbbff7bc95c77778c7536e9d5aa9c890b0369cc Mon Sep 17 00:00:00 2001 From: e11sy <130844513+e11sy@users.noreply.github.com> Date: Tue, 2 Sep 2025 17:26:25 +0300 Subject: [PATCH 05/15] fix(): release expectations (#527) * fix(): release expectations * Bump version up to 1.1.35 --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- package.json | 2 +- src/typeDefs/event.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 968062e3..9671d8f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.34", + "version": "1.1.35", "main": "index.ts", "license": "UNLICENSED", "scripts": { diff --git a/src/typeDefs/event.ts b/src/typeDefs/event.ts index cd494ad1..816357aa 100644 --- a/src/typeDefs/event.ts +++ b/src/typeDefs/event.ts @@ -53,7 +53,7 @@ type Release { """ Release commits """ - commits: [Commit!]! + commits: [Commit!] } """ From 14a5c477bdc7f660deb120258d488f302c120ed7 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 15:13:06 +0000 Subject: [PATCH 06/15] Bump version up to 1.1.36 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9671d8f3..edb7e18a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.35", + "version": "1.1.36", "main": "index.ts", "license": "UNLICENSED", "scripts": { From ae053cf261eaba1562216dcefcd9645e6d626f81 Mon Sep 17 00:00:00 2001 From: Tanya Fomina Date: Sun, 7 Sep 2025 18:57:00 +0300 Subject: [PATCH 07/15] Upd --- src/directives/allowAnon.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/directives/allowAnon.ts b/src/directives/allowAnon.ts index 7a24cc18..f4065b7e 100644 --- a/src/directives/allowAnon.ts +++ b/src/directives/allowAnon.ts @@ -43,7 +43,6 @@ export default function allowAnonDirective(directiveName = 'allowAnon') { const [, , context] = resolverArgs; context.isAnonAllowed = true; - return resolve.apply(this, resolverArgs); }; From 4e3e0f205542b8a0ffd08b327e19814d0fe64823 Mon Sep 17 00:00:00 2001 From: Tanya Fomina Date: Sun, 7 Sep 2025 19:04:09 +0300 Subject: [PATCH 08/15] Upd --- src/directives/allowAnon.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/directives/allowAnon.ts b/src/directives/allowAnon.ts index f4065b7e..7a24cc18 100644 --- a/src/directives/allowAnon.ts +++ b/src/directives/allowAnon.ts @@ -43,6 +43,7 @@ export default function allowAnonDirective(directiveName = 'allowAnon') { const [, , context] = resolverArgs; context.isAnonAllowed = true; + return resolve.apply(this, resolverArgs); }; From 59d3969f3e839be3ce78bf95bdcf4da5a74ecd4b Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Mon, 8 Sep 2025 20:26:15 +0200 Subject: [PATCH 09/15] trigger CI From c7bf853e46fb6f6b64186b342d33701a3a4bd4ca Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Mon, 8 Sep 2025 20:50:15 +0200 Subject: [PATCH 10/15] Update GitHub Actions workflow to check for version bumps and upgrade action versions --- .github/workflows/bump-version.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 8e03f837..2f5ca7cc 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -6,9 +6,11 @@ jobs: # If pull request was merged then we should check for a package version update check-version-update: runs-on: ubuntu-22.04 + outputs: + should-bump: ${{ steps.version-check.outputs.should-bump }} steps: # Checkout to target branch - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 with: fetch-depth: 0 @@ -26,20 +28,26 @@ jobs: id: packageOld uses: codex-team/action-nodejs-package-info@v1 - # Stop workflow and do not bump version if it was changed already - - name: Stop workflow and do not bump version if it was changed already - uses: andymckay/cancel-action@0.2 - if: steps.packageOld.outputs.version != steps.packageNew.outputs.version + # Check if version should be bumped + - name: Check if version should be bumped + id: version-check + run: | + if [ "${{ steps.packageOld.outputs.version }}" == "${{ steps.packageNew.outputs.version }}" ]; then + echo "should-bump=true" >> $GITHUB_OUTPUT + else + echo "should-bump=false" >> $GITHUB_OUTPUT + fi bump-version: needs: check-version-update + if: needs.check-version-update.outputs.should-bump == 'true' runs-on: ubuntu-22.04 steps: # Checkout to target branch - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 # Setup node environment - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v5 with: node-version-file: '.nvmrc' registry-url: https://registry.npmjs.org/ @@ -54,7 +62,7 @@ jobs: uses: codex-team/action-nodejs-package-info@v1 # Commit version upgrade - - uses: EndBug/add-and-commit@v7 + - uses: EndBug/add-and-commit@v9 with: author_name: github-actions author_email: 41898282+github-actions[bot]@users.noreply.github.com From 570344df2c833deb99c937abff40a0b6e8ee0f93 Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Mon, 8 Sep 2025 20:54:41 +0200 Subject: [PATCH 11/15] fix --- .github/workflows/bump-version.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 2f5ca7cc..9e495603 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -45,6 +45,9 @@ jobs: steps: # Checkout to target branch - uses: actions/checkout@v5 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.ref }} # Setup node environment - uses: actions/setup-node@v5 From bff61590fd94ff8f3b7b194a6a67bf701daf80f2 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 18:55:11 +0000 Subject: [PATCH 12/15] Bump version up to 1.1.29 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f47295e..f9b32ca1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.28", + "version": "1.1.29", "main": "index.ts", "license": "UNLICENSED", "scripts": { From 9ea3c7d0eccc574f74192be27382c2075e3f38c4 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 06:36:22 +0000 Subject: [PATCH 13/15] Bump version up to 1.1.37 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index edb7e18a..3447525d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.36", + "version": "1.1.37", "main": "index.ts", "license": "UNLICENSED", "scripts": { From 50b727d684ad2f2d2f24cef9dbc3e5d31bb952a3 Mon Sep 17 00:00:00 2001 From: Tanya Fomina Date: Thu, 11 Sep 2025 22:18:22 +0300 Subject: [PATCH 14/15] Upd --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3447525d..96e8a0d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.37", + "version": "1.1.38", "main": "index.ts", "license": "UNLICENSED", "scripts": { From 4b100afc4c9047797d33643756ab14bffbfc815c Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Thu, 11 Sep 2025 21:38:16 +0200 Subject: [PATCH 15/15] upd --- .github/workflows/build-and-push-docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-push-docker-image.yml b/.github/workflows/build-and-push-docker-image.yml index 12dd5c6a..c6acacfc 100644 --- a/.github/workflows/build-and-push-docker-image.yml +++ b/.github/workflows/build-and-push-docker-image.yml @@ -3,7 +3,7 @@ name: Build and push docker image on: push: branches: - - '*' + - '**' tags: - 'v*'