From 0520cee7af4880b6976d1310e6948e6e61374fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D1=82=D1=83=D0=B0=D0=BD?= Date: Fri, 27 Feb 2026 17:30:42 +0300 Subject: [PATCH 01/10] chore: add cloudPaymentsPublicId to composePayment --- src/resolvers/billingNew.ts | 2 ++ src/typeDefs/billing.ts | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/resolvers/billingNew.ts b/src/resolvers/billingNew.ts index 64e1537f..ee973d22 100644 --- a/src/resolvers/billingNew.ts +++ b/src/resolvers/billingNew.ts @@ -86,6 +86,7 @@ export default { currency: string; checksum: string; nextPaymentDate: Date; + cloudPaymentsPublicId: string; }> { const { workspaceId, tariffPlanId, shouldSaveCard } = input; @@ -178,6 +179,7 @@ debug: ${Boolean(workspace.isDebug)}` currency: 'RUB', checksum, nextPaymentDate, + cloudPaymentsPublicId: process.env.CLOUDPAYMENTS_PUBLIC_ID || '', }; }, }, diff --git a/src/typeDefs/billing.ts b/src/typeDefs/billing.ts index f277fbca..d9b67442 100644 --- a/src/typeDefs/billing.ts +++ b/src/typeDefs/billing.ts @@ -270,6 +270,11 @@ type ComposePaymentResponse { Next payment date (recurrent start) """ nextPaymentDate: DateTime! + + """ + CloudPayments public id (merchant identifier for widget) + """ + cloudPaymentsPublicId: String! } From 0cdb6610584b0df68f251ea9f58cf2490f6dc534 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:31:54 +0000 Subject: [PATCH 02/10] Bump version up to 1.4.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3ab0a13c..8d8b9bca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.4.7", + "version": "1.4.8", "main": "index.ts", "license": "BUSL-1.1", "scripts": { From 4bd5f58b900f7f7bdbca5f6d9b96e639d0f27f2b Mon Sep 17 00:00:00 2001 From: quangtuanitmo18 Date: Sat, 28 Feb 2026 22:24:24 +0300 Subject: [PATCH 03/10] fix: disable free plan reset --- src/resolvers/workspace.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resolvers/workspace.js b/src/resolvers/workspace.js index 2333099d..5d793599 100644 --- a/src/resolvers/workspace.js +++ b/src/resolvers/workspace.js @@ -436,7 +436,7 @@ module.exports = { const defaultPlan = await factories.plansFactory.getDefaultPlan(); - if (workspaceModel.tariffPlanId === defaultPlan.id) { + if (workspaceModel.tariffPlanId.toString() === defaultPlan._id.toString()) { throw new UserInputError('You already use default plan'); } From 56d21270800413551007e8498d5bf14f4c756be8 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 19:26:24 +0000 Subject: [PATCH 04/10] Bump version up to 1.4.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3ab0a13c..8d8b9bca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.4.7", + "version": "1.4.8", "main": "index.ts", "license": "BUSL-1.1", "scripts": { From 35b19dcaad5866d6b3f2916d930478a7d614c7b5 Mon Sep 17 00:00:00 2001 From: quangtuanitmo18 Date: Sat, 28 Feb 2026 23:01:57 +0300 Subject: [PATCH 05/10] chore: add comment --- src/resolvers/workspace.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/resolvers/workspace.js b/src/resolvers/workspace.js index 5d793599..f7d480d8 100644 --- a/src/resolvers/workspace.js +++ b/src/resolvers/workspace.js @@ -436,6 +436,8 @@ module.exports = { const defaultPlan = await factories.plansFactory.getDefaultPlan(); + + // Prevent re-applying the free plan if workspace is already on it. if (workspaceModel.tariffPlanId.toString() === defaultPlan._id.toString()) { throw new UserInputError('You already use default plan'); } From a86a9372d161d30dd55f2e107a9cc2e61668cb38 Mon Sep 17 00:00:00 2001 From: quangtuanitmo18 Date: Sat, 28 Feb 2026 23:04:56 +0300 Subject: [PATCH 06/10] fix: fix eslint --- src/resolvers/workspace.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/resolvers/workspace.js b/src/resolvers/workspace.js index f7d480d8..83ef92ae 100644 --- a/src/resolvers/workspace.js +++ b/src/resolvers/workspace.js @@ -436,7 +436,6 @@ module.exports = { const defaultPlan = await factories.plansFactory.getDefaultPlan(); - // Prevent re-applying the free plan if workspace is already on it. if (workspaceModel.tariffPlanId.toString() === defaultPlan._id.toString()) { throw new UserInputError('You already use default plan'); From 39ee1624e2972874f284ded330025f77531d98d8 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 14:44:03 +0000 Subject: [PATCH 07/10] Bump version up to 1.4.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d8b9bca..68211463 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.4.8", + "version": "1.4.9", "main": "index.ts", "license": "BUSL-1.1", "scripts": { From 4e718ac234a54be00f5908d1dda17d96f74538e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D1=82=D1=83=D0=B0=D0=BD?= Date: Mon, 2 Mar 2026 18:29:43 +0300 Subject: [PATCH 08/10] minor change --- src/typeDefs/billing.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/typeDefs/billing.ts b/src/typeDefs/billing.ts index d9b67442..7cf9197b 100644 --- a/src/typeDefs/billing.ts +++ b/src/typeDefs/billing.ts @@ -272,7 +272,7 @@ type ComposePaymentResponse { nextPaymentDate: DateTime! """ - CloudPayments public id (merchant identifier for widget) + CloudPayments public id (merchant identifier for payment widget) """ cloudPaymentsPublicId: String! } From 3ac9bcb339325dfde2dcdc74e2212f0dafa39cb5 Mon Sep 17 00:00:00 2001 From: Dobrunia Kostrigin <48620984+Dobrunia@users.noreply.github.com> Date: Wed, 18 Mar 2026 15:12:41 +0300 Subject: [PATCH 09/10] feat(api): add assignee filter to project daily events search --- src/models/eventsFactory.js | 10 ++- src/resolvers/project.js | 12 ++- src/typeDefs/project.ts | 9 ++ .../project-daily-events-portion.test.ts | 89 +++++++++++++++++++ 4 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 test/resolvers/project-daily-events-portion.test.ts diff --git a/src/models/eventsFactory.js b/src/models/eventsFactory.js index bf3efb13..1a3df725 100644 --- a/src/models/eventsFactory.js +++ b/src/models/eventsFactory.js @@ -216,7 +216,8 @@ class EventsFactory extends Factory { sort = 'BY_DATE', filters = {}, search = '', - release + release, + assignee ) { if (typeof search !== 'string') { throw new Error('Search parameter must be a string'); @@ -334,10 +335,12 @@ class EventsFactory extends Factory { } : {}; + const markFilters = ['resolved', 'starred', 'ignored']; const matchFilter = filters ? Object.fromEntries( Object .entries(filters) + .filter(([mark]) => markFilters.includes(mark)) .map(([mark, exists]) => [`event.marks.${mark}`, { $exists: exists } ]) ) : {}; @@ -361,6 +364,10 @@ class EventsFactory extends Factory { } : {}; + const assigneeFilter = assignee + ? { 'event.assignee': String(assignee) } + : {}; + pipeline.push( /** * Left outer join original event on groupHash field @@ -398,6 +405,7 @@ class EventsFactory extends Factory { ...matchFilter, ...searchFilter, ...releaseFilter, + ...assigneeFilter, }, }, { $limit: limit + 1 }, diff --git a/src/resolvers/project.js b/src/resolvers/project.js index c1a2767c..63b00cff 100644 --- a/src/resolvers/project.js +++ b/src/resolvers/project.js @@ -583,7 +583,7 @@ module.exports = { * * @return {Promise} */ - async dailyEventsPortion(project, { limit, nextCursor, sort, filters, search, release }, context) { + async dailyEventsPortion(project, { limit, nextCursor, sort, filters, search, release, assignee }, context) { if (search) { if (search.length > MAX_SEARCH_QUERY_LENGTH) { search = search.slice(0, MAX_SEARCH_QUERY_LENGTH); @@ -592,7 +592,15 @@ module.exports = { const factory = getEventsFactory(context, project._id); - const dailyEventsPortion = await factory.findDailyEventsPortion(limit, nextCursor, sort, filters, search, release); + const dailyEventsPortion = await factory.findDailyEventsPortion( + limit, + nextCursor, + sort, + filters, + search, + release, + assignee + ); return dailyEventsPortion; }, diff --git a/src/typeDefs/project.ts b/src/typeDefs/project.ts index 296beb41..494cca39 100644 --- a/src/typeDefs/project.ts +++ b/src/typeDefs/project.ts @@ -123,6 +123,10 @@ input EventsFiltersInput { If True, includes events with ignored mark to the output """ ignored: Boolean + """ + Includes only events assigned to passed user id + """ + assignee: ID } """ @@ -347,6 +351,11 @@ type Project { Release label to filter events by payload.release """ release: String + + """ + User id to filter events by assignee + """ + assignee: ID ): DailyEventsPortion """ diff --git a/test/resolvers/project-daily-events-portion.test.ts b/test/resolvers/project-daily-events-portion.test.ts new file mode 100644 index 00000000..93c2a96b --- /dev/null +++ b/test/resolvers/project-daily-events-portion.test.ts @@ -0,0 +1,89 @@ +import '../../src/env-test'; + +jest.mock('../../src/integrations/github/service', () => require('../__mocks__/github-service')); + +jest.mock('../../src/resolvers/helpers/eventsFactory', () => ({ + __esModule: true, + default: jest.fn(), +})); + +// @ts-expect-error - CommonJS module, TypeScript can't infer types properly +import projectResolverModule from '../../src/resolvers/project'; +import getEventsFactory from '../../src/resolvers/helpers/eventsFactory'; + +const projectResolver = projectResolverModule as { + Project: { + dailyEventsPortion: (...args: unknown[]) => Promise; + }; +}; + +describe('Project resolver dailyEventsPortion', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should pass assignee filter to events factory', async () => { + const findDailyEventsPortion = jest.fn().mockResolvedValue({ + nextCursor: null, + dailyEvents: [], + }); + (getEventsFactory as unknown as jest.Mock).mockReturnValue({ + findDailyEventsPortion, + }); + + const project = { _id: 'project-1' }; + const args = { + limit: 50, + nextCursor: null, + sort: 'BY_DATE', + filters: { ignored: true }, + search: 'TypeError', + release: '1.0.0', + assignee: 'user-123', + }; + + await projectResolver.Project.dailyEventsPortion(project, args, {}); + + expect(findDailyEventsPortion).toHaveBeenCalledWith( + 50, + null, + 'BY_DATE', + { ignored: true }, + 'TypeError', + '1.0.0', + 'user-123' + ); + }); + + it('should keep old call shape when assignee is not provided', async () => { + const findDailyEventsPortion = jest.fn().mockResolvedValue({ + nextCursor: null, + dailyEvents: [], + }); + (getEventsFactory as unknown as jest.Mock).mockReturnValue({ + findDailyEventsPortion, + }); + + const project = { _id: 'project-1' }; + const args = { + limit: 10, + nextCursor: null, + sort: 'BY_DATE', + filters: {}, + search: '', + release: undefined, + }; + + await projectResolver.Project.dailyEventsPortion(project, args, {}); + + expect(findDailyEventsPortion).toHaveBeenCalledWith( + 10, + null, + 'BY_DATE', + {}, + '', + undefined, + undefined + ); + }); +}); From e74a018706bf189c43798daf7c83fcde621e1a2b Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:13:46 +0000 Subject: [PATCH 10/10] Bump version up to 1.4.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 68211463..126150a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.4.9", + "version": "1.4.10", "main": "index.ts", "license": "BUSL-1.1", "scripts": {