From 42e4d47c5688f9cf72c8ea7626af269bb93f1a9f Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sat, 15 Mar 2025 02:20:39 +0300 Subject: [PATCH 01/26] releaser logic --- src/dataLoaders.ts | 7 +++- src/index.ts | 5 +++ src/models/releaseFactory.ts | 58 ++++++++++++++++++++++++++ src/typeDefs/release.ts | 79 ++++++++++++++++++++++++++++++++++++ src/types/graphql.ts | 12 +++--- 5 files changed, 154 insertions(+), 7 deletions(-) create mode 100644 src/models/releaseFactory.ts create mode 100644 src/typeDefs/release.ts diff --git a/src/dataLoaders.ts b/src/dataLoaders.ts index 6c696049..e51e416b 100644 --- a/src/dataLoaders.ts +++ b/src/dataLoaders.ts @@ -1,6 +1,6 @@ import DataLoader from 'dataloader'; import { Db, ObjectId } from 'mongodb'; -import { PlanDBScheme, UserDBScheme, WorkspaceDBScheme, ProjectDBScheme } from '@hawk.so/types'; +import { PlanDBScheme, UserDBScheme, WorkspaceDBScheme, ProjectDBScheme, ReleaseDBScheme } from '@hawk.so/types'; /** * Class for setting up data loaders @@ -47,6 +47,11 @@ export default class DataLoaders { { cache: false } ); + public releaseById = new DataLoader( + (releaseIds) => this.batchByIds('releases', releaseIds), + { cache: false } + ); + /** * MongoDB connection to make queries */ diff --git a/src/index.ts b/src/index.ts index 1ed92aa8..a2ec88e9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,6 +26,7 @@ import PlansFactory from './models/plansFactory'; import BusinessOperationsFactory from './models/businessOperationsFactory'; import schema from './schema'; import { graphqlUploadExpress } from 'graphql-upload'; +import ReleasesFactory from './models/releaseFactory'; /** * Option to enable playground @@ -145,12 +146,16 @@ class HawkAPI { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const businessOperationsFactory = new BusinessOperationsFactory(mongo.databases.hawk!, dataLoaders); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const releasesFactory = new ReleasesFactory(mongo.databases.hawk!, dataLoaders); + return { usersFactory, workspacesFactory, projectsFactory, plansFactory, businessOperationsFactory, + releasesFactory, }; } diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts new file mode 100644 index 00000000..0ca17aad --- /dev/null +++ b/src/models/releaseFactory.ts @@ -0,0 +1,58 @@ +import { Collection, Db } from 'mongodb'; +import { ReleaseDBScheme } from '@hawk.so/types'; +import DataLoaders from '../dataLoaders'; + +export default class ReleasesFactory { + /** + * Коллекция релизов + */ + private collection: Collection; + + /** + * DataLoader для релизов + */ + private dataLoaders: DataLoaders; + + /** + * Создаёт экземпляр фабрики релизов + * @param dbConnection - подключение к базе данных + * @param dataLoaders - экземпляр DataLoaders для батчинга запросов + */ + constructor(dbConnection: Db, dataLoaders: DataLoaders) { + this.collection = dbConnection.collection('releases'); + this.dataLoaders = dataLoaders; + } + + /** + * Получить релиз по его идентификатору с использованием DataLoader + * @param id - идентификатор релиза + */ + public async getReleaseById(id: string): Promise { + return this.dataLoaders.releaseById.load(id); + } + + /** + * Получить все релизы + */ + public async getAllReleases(): Promise { + return this.collection.find({}).toArray(); + } + + /** + * Получить релизы с пагинацией + * @param page - номер страницы (начиная с 1) + * @param limit - количество элементов на страницу + */ + public async getReleasesPaginated(page: number, limit: number): Promise { + const skip = (page - 1) * limit; + return this.collection.find({}).skip(skip).limit(limit).toArray(); + } + + /** + * Получить релизы по идентификатору проекта + * @param projectId - идентификатор проекта + */ + public async getReleasesByProjectId(projectId: string): Promise { + return this.collection.find({ projectId }).toArray(); + } +} diff --git a/src/typeDefs/release.ts b/src/typeDefs/release.ts new file mode 100644 index 00000000..048bd05b --- /dev/null +++ b/src/typeDefs/release.ts @@ -0,0 +1,79 @@ +import { gql } from 'apollo-server-express'; + +export default gql` + """ + Release commit + """ + type Commit { + """ + Hash of the commit + """ + hash: String! + + """ + Commit author + """ + author: String! + + """ + Commit title + """ + title: String! + + """ + Commit creation date + """ + date: DateTime! + } + + """ + Source map file details + """ + type SourceMapData { + """ + Source map filename + """ + mapFileName: String! + + """ + Original source filename + """ + originFileName: String! + } + + """ + Release data + """ + type Release { + """ + Release name + """ + releaseName: String! @renameFrom(name: "release") + + """ + Project ID associated with the release + """ + projectId: ID! + + """ + Release commits + """ + commits: [Commit!]! + + """ + Source maps associated with the release + """ + files: [SourceMapData!]! + } + + """ + Queries related to releases + """ + extend type Query { + """ + Fetch list of releases. + If projectId is provided, fetch releases for the given project. + """ + getReleases(projectId: ID): [Release]! + } +`; diff --git a/src/types/graphql.ts b/src/types/graphql.ts index d3ee4095..56a5bb3d 100644 --- a/src/types/graphql.ts +++ b/src/types/graphql.ts @@ -2,9 +2,9 @@ import UsersFactory from '../models/usersFactory'; import WorkspacesFactory from '../models/workspacesFactory'; import { GraphQLField } from 'graphql'; import ProjectsFactory from '../models/projectsFactory'; -// import Accounting from 'codex-accounting-sdk'; import PlansFactory from '../models/plansFactory'; import BusinessOperationsFactory from '../models/businessOperationsFactory'; +import ReleasesFactory from "../models/releaseFactory"; /** * Resolver's Context argument @@ -19,11 +19,6 @@ export interface ResolverContextBase { * Factories for working with models */ factories: ContextFactories; - - // /** - // * SDK for working with CodeX Accounting API - // */ - // accounting: Accounting; } /** @@ -79,6 +74,11 @@ export interface ContextFactories { * Allows to work with the Business Operations models */ businessOperationsFactory: BusinessOperationsFactory; + + /** + * Allows to work with releases + */ + releasesFactory: ReleasesFactory; } /** From 83636d10db741443af4c9e897a75ca226968589f Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sat, 15 Mar 2025 02:37:16 +0300 Subject: [PATCH 02/26] add release to resolvers andtypedefs --- src/resolvers/index.js | 2 ++ src/resolvers/release.ts | 24 ++++++++++++++++++++++++ src/typeDefs/index.ts | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 src/resolvers/release.ts diff --git a/src/resolvers/index.js b/src/resolvers/index.js index 28589515..3d064140 100644 --- a/src/resolvers/index.js +++ b/src/resolvers/index.js @@ -17,6 +17,7 @@ const userNotifications = require('./userNotifications').default; const billing = require('./billingNew').default; const EncodedJSON = require('./encodedJSON').default; const seed = require('./seed').default; +const release = require('./release').default; /** * @typedef ResolverObj @@ -74,6 +75,7 @@ const resolvers = [ userNotifications, plans, billing, + release, ]; if (isE2E) { diff --git a/src/resolvers/release.ts b/src/resolvers/release.ts new file mode 100644 index 00000000..df05295d --- /dev/null +++ b/src/resolvers/release.ts @@ -0,0 +1,24 @@ +import ReleasesFactory from '../models/releaseFactory'; + +export default { + Query: { + /** + * Fetch all releases or releases filtered by projectId + * @param {ResolverObj} _ - Parent object, not used + * @param {ResolverArgs} args - Query arguments + * @param {ContextFactories} context - Global GraphQL context with factories + * @returns {Promise} + */ + getReleases: async (_: any, args: { projectId?: string }, { factories }: any) => { + try { + if (args.projectId) { + return await factories.releasesFactory.getReleasesByProjectId(args.projectId); + } + return await factories.releasesFactory.getAllReleases(); + } catch (error) { + console.error('Error fetching releases:', error); + throw new Error('Не удалось получить релизы'); + } + }, + }, +}; diff --git a/src/typeDefs/index.ts b/src/typeDefs/index.ts index 117b64e4..d9d666d0 100644 --- a/src/typeDefs/index.ts +++ b/src/typeDefs/index.ts @@ -15,6 +15,7 @@ import workspaceMutations from './workspaceMutations'; import chart from './chart'; import plans from './plans'; import seed from './seed'; +import release from './release'; import isE2E from '../utils/isE2E'; const rootSchema = gql` @@ -98,6 +99,7 @@ const typeDefinitions = [ workspaceMutations, chart, plans, + release, ]; if (isE2E) { From c34e2d564dd39a98bc71a53f991c912a13340e82 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sat, 15 Mar 2025 03:04:43 +0300 Subject: [PATCH 03/26] rm release comms --- src/typeDefs/release.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/typeDefs/release.ts b/src/typeDefs/release.ts index 048bd05b..97daa1a1 100644 --- a/src/typeDefs/release.ts +++ b/src/typeDefs/release.ts @@ -66,9 +66,6 @@ export default gql` files: [SourceMapData!]! } - """ - Queries related to releases - """ extend type Query { """ Fetch list of releases. From 7a787a94e1580c897c7f7cd5a2f66409181acb7c Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sat, 15 Mar 2025 15:09:35 +0300 Subject: [PATCH 04/26] add logs --- src/models/releaseFactory.ts | 41 ++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index 0ca17aad..3088ce1a 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -21,6 +21,7 @@ export default class ReleasesFactory { constructor(dbConnection: Db, dataLoaders: DataLoaders) { this.collection = dbConnection.collection('releases'); this.dataLoaders = dataLoaders; + console.log("[ReleasesFactory] Initialized with collection 'releases'"); } /** @@ -28,14 +29,30 @@ export default class ReleasesFactory { * @param id - идентификатор релиза */ public async getReleaseById(id: string): Promise { - return this.dataLoaders.releaseById.load(id); + console.log(`[ReleasesFactory] getReleaseById called with id: ${id}`); + try { + const release = await this.dataLoaders.releaseById.load(id); + console.log(`[ReleasesFactory] getReleaseById result:`, release); + return release; + } catch (error) { + console.error(`[ReleasesFactory] Error in getReleaseById:`, error); + throw error; + } } /** * Получить все релизы */ public async getAllReleases(): Promise { - return this.collection.find({}).toArray(); + console.log(`[ReleasesFactory] getAllReleases called`); + try { + const releases = await this.collection.find({}).toArray(); + console.log(`[ReleasesFactory] getAllReleases returned ${releases.length} releases`); + return releases; + } catch (error) { + console.error(`[ReleasesFactory] Error in getAllReleases:`, error); + throw error; + } } /** @@ -45,7 +62,15 @@ export default class ReleasesFactory { */ public async getReleasesPaginated(page: number, limit: number): Promise { const skip = (page - 1) * limit; - return this.collection.find({}).skip(skip).limit(limit).toArray(); + console.log(`[ReleasesFactory] getReleasesPaginated called with page: ${page}, limit: ${limit}, skip: ${skip}`); + try { + const releases = await this.collection.find({}).skip(skip).limit(limit).toArray(); + console.log(`[ReleasesFactory] getReleasesPaginated returned ${releases.length} releases`); + return releases; + } catch (error) { + console.error(`[ReleasesFactory] Error in getReleasesPaginated:`, error); + throw error; + } } /** @@ -53,6 +78,14 @@ export default class ReleasesFactory { * @param projectId - идентификатор проекта */ public async getReleasesByProjectId(projectId: string): Promise { - return this.collection.find({ projectId }).toArray(); + console.log(`[ReleasesFactory] getReleasesByProjectId called with projectId: ${projectId}`); + try { + const releases = await this.collection.find({ projectId: projectId }).toArray(); + console.log(`[ReleasesFactory] getReleasesByProjectId returned ${releases.length} releases`); + return releases; + } catch (error) { + console.error(`[ReleasesFactory] Error in getReleasesByProjectId:`, error); + throw error; + } } } From 4dcfda08a5fd1cc39275f9e6f14fdd1bb14ce27a Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sat, 15 Mar 2025 15:23:15 +0300 Subject: [PATCH 05/26] change db --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index a2ec88e9..2117cd49 100644 --- a/src/index.ts +++ b/src/index.ts @@ -147,7 +147,7 @@ class HawkAPI { const businessOperationsFactory = new BusinessOperationsFactory(mongo.databases.hawk!, dataLoaders); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const releasesFactory = new ReleasesFactory(mongo.databases.hawk!, dataLoaders); + const releasesFactory = new ReleasesFactory(mongo.databases.events!, dataLoaders); return { usersFactory, From 0cd110700a585a84fd15ae75f25fe9d8a044c497 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Mar 2025 12:30:49 +0000 Subject: [PATCH 06/26] Bump version up to 1.1.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8b051888..4f3b0fde 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.14", + "version": "1.1.15", "main": "index.ts", "license": "UNLICENSED", "scripts": { From 111dc39c0a11b6b53ed7cefe56039a6673b38300 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sat, 15 Mar 2025 17:51:44 +0300 Subject: [PATCH 07/26] add comms in graphql and translate to eng --- src/models/releaseFactory.ts | 26 +++++++++++++------------- src/types/graphql.ts | 5 +++++ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index 3088ce1a..05e39581 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -4,19 +4,19 @@ import DataLoaders from '../dataLoaders'; export default class ReleasesFactory { /** - * Коллекция релизов + * Releases collection */ private collection: Collection; /** - * DataLoader для релизов + * DataLoader for releases */ private dataLoaders: DataLoaders; /** - * Создаёт экземпляр фабрики релизов - * @param dbConnection - подключение к базе данных - * @param dataLoaders - экземпляр DataLoaders для батчинга запросов + * Creates an instance of the releases factory + * @param dbConnection - database connection + * @param dataLoaders - DataLoaders instance for request batching */ constructor(dbConnection: Db, dataLoaders: DataLoaders) { this.collection = dbConnection.collection('releases'); @@ -25,8 +25,8 @@ export default class ReleasesFactory { } /** - * Получить релиз по его идентификатору с использованием DataLoader - * @param id - идентификатор релиза + * Get a release by its identifier using DataLoader + * @param id - release identifier */ public async getReleaseById(id: string): Promise { console.log(`[ReleasesFactory] getReleaseById called with id: ${id}`); @@ -41,7 +41,7 @@ export default class ReleasesFactory { } /** - * Получить все релизы + * Get all releases */ public async getAllReleases(): Promise { console.log(`[ReleasesFactory] getAllReleases called`); @@ -56,9 +56,9 @@ export default class ReleasesFactory { } /** - * Получить релизы с пагинацией - * @param page - номер страницы (начиная с 1) - * @param limit - количество элементов на страницу + * Get releases with pagination + * @param page - page number (starting from 1) + * @param limit - number of items per page */ public async getReleasesPaginated(page: number, limit: number): Promise { const skip = (page - 1) * limit; @@ -74,8 +74,8 @@ export default class ReleasesFactory { } /** - * Получить релизы по идентификатору проекта - * @param projectId - идентификатор проекта + * Get releases by project identifier + * @param projectId - project identifier */ public async getReleasesByProjectId(projectId: string): Promise { console.log(`[ReleasesFactory] getReleasesByProjectId called with projectId: ${projectId}`); diff --git a/src/types/graphql.ts b/src/types/graphql.ts index 56a5bb3d..f69cae3e 100644 --- a/src/types/graphql.ts +++ b/src/types/graphql.ts @@ -19,6 +19,11 @@ export interface ResolverContextBase { * Factories for working with models */ factories: ContextFactories; + + // /** + // * SDK for working with CodeX Accounting API + // */ + // accounting: Accounting; } /** From f37f07108c9b9bfe61d9bfd36abcb53fd69ebacc Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sat, 15 Mar 2025 20:36:41 +0300 Subject: [PATCH 08/26] rm useless rm logs rm commit type add eng lang --- src/models/releaseFactory.ts | 54 +++++------------------------------- src/resolvers/release.ts | 17 ++++++------ src/typeDefs/release.ts | 29 ++----------------- 3 files changed, 18 insertions(+), 82 deletions(-) diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index 05e39581..4cee0b14 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -21,54 +21,17 @@ export default class ReleasesFactory { constructor(dbConnection: Db, dataLoaders: DataLoaders) { this.collection = dbConnection.collection('releases'); this.dataLoaders = dataLoaders; - console.log("[ReleasesFactory] Initialized with collection 'releases'"); } /** * Get a release by its identifier using DataLoader - * @param id - release identifier + * @param releaseId - release identifier */ - public async getReleaseById(id: string): Promise { - console.log(`[ReleasesFactory] getReleaseById called with id: ${id}`); + public async findById(releaseId: string): Promise { try { - const release = await this.dataLoaders.releaseById.load(id); - console.log(`[ReleasesFactory] getReleaseById result:`, release); - return release; + return await this.dataLoaders.releaseById.load(releaseId); } catch (error) { - console.error(`[ReleasesFactory] Error in getReleaseById:`, error); - throw error; - } - } - - /** - * Get all releases - */ - public async getAllReleases(): Promise { - console.log(`[ReleasesFactory] getAllReleases called`); - try { - const releases = await this.collection.find({}).toArray(); - console.log(`[ReleasesFactory] getAllReleases returned ${releases.length} releases`); - return releases; - } catch (error) { - console.error(`[ReleasesFactory] Error in getAllReleases:`, error); - throw error; - } - } - - /** - * Get releases with pagination - * @param page - page number (starting from 1) - * @param limit - number of items per page - */ - public async getReleasesPaginated(page: number, limit: number): Promise { - const skip = (page - 1) * limit; - console.log(`[ReleasesFactory] getReleasesPaginated called with page: ${page}, limit: ${limit}, skip: ${skip}`); - try { - const releases = await this.collection.find({}).skip(skip).limit(limit).toArray(); - console.log(`[ReleasesFactory] getReleasesPaginated returned ${releases.length} releases`); - return releases; - } catch (error) { - console.error(`[ReleasesFactory] Error in getReleasesPaginated:`, error); + console.error(`[ReleasesFactory] Error in findById:`, error); throw error; } } @@ -77,14 +40,11 @@ export default class ReleasesFactory { * Get releases by project identifier * @param projectId - project identifier */ - public async getReleasesByProjectId(projectId: string): Promise { - console.log(`[ReleasesFactory] getReleasesByProjectId called with projectId: ${projectId}`); + public async findManyByProjectId(projectId: string): Promise { try { - const releases = await this.collection.find({ projectId: projectId }).toArray(); - console.log(`[ReleasesFactory] getReleasesByProjectId returned ${releases.length} releases`); - return releases; + return await this.collection.find({ projectId: projectId }).toArray(); } catch (error) { - console.error(`[ReleasesFactory] Error in getReleasesByProjectId:`, error); + console.error(`[ReleasesFactory] Error in findManyByProjectId:`, error); throw error; } } diff --git a/src/resolvers/release.ts b/src/resolvers/release.ts index df05295d..73dd4024 100644 --- a/src/resolvers/release.ts +++ b/src/resolvers/release.ts @@ -3,21 +3,22 @@ import ReleasesFactory from '../models/releaseFactory'; export default { Query: { /** - * Fetch all releases or releases filtered by projectId + * Fetch releases by projectId * @param {ResolverObj} _ - Parent object, not used - * @param {ResolverArgs} args - Query arguments + * @param {ResolverArgs} args - Query arguments containing required projectId * @param {ContextFactories} context - Global GraphQL context with factories * @returns {Promise} */ - getReleases: async (_: any, args: { projectId?: string }, { factories }: any) => { + getReleases: async (_: any, args: { projectId: string }, { factories }: any) => { + if (!args.projectId) { + throw new Error('projectId is required to fetch releases'); + } + try { - if (args.projectId) { - return await factories.releasesFactory.getReleasesByProjectId(args.projectId); - } - return await factories.releasesFactory.getAllReleases(); + return await factories.releasesFactory.findManyByProjectId(args.projectId); } catch (error) { console.error('Error fetching releases:', error); - throw new Error('Не удалось получить релизы'); + throw new Error('Failed to get the releases'); } }, }, diff --git a/src/typeDefs/release.ts b/src/typeDefs/release.ts index 97daa1a1..9de864d7 100644 --- a/src/typeDefs/release.ts +++ b/src/typeDefs/release.ts @@ -1,31 +1,6 @@ import { gql } from 'apollo-server-express'; export default gql` - """ - Release commit - """ - type Commit { - """ - Hash of the commit - """ - hash: String! - - """ - Commit author - """ - author: String! - - """ - Commit title - """ - title: String! - - """ - Commit creation date - """ - date: DateTime! - } - """ Source map file details """ @@ -48,7 +23,7 @@ export default gql` """ Release name """ - releaseName: String! @renameFrom(name: "release") + release: String! """ Project ID associated with the release @@ -58,7 +33,7 @@ export default gql` """ Release commits """ - commits: [Commit!]! + commits: [Commit!] """ Source maps associated with the release From 1e189e9e635c12c4034d38f0aaad8b89c7c0e10d Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sat, 15 Mar 2025 22:47:42 +0300 Subject: [PATCH 09/26] fix --- src/resolvers/release.ts | 2 +- src/resolvers/user.ts | 4 ++-- src/types/graphql.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/resolvers/release.ts b/src/resolvers/release.ts index 73dd4024..3248eb7d 100644 --- a/src/resolvers/release.ts +++ b/src/resolvers/release.ts @@ -5,7 +5,7 @@ export default { /** * Fetch releases by projectId * @param {ResolverObj} _ - Parent object, not used - * @param {ResolverArgs} args - Query arguments containing required projectId + * @param {ResolverArgs} args - Query arguments containing required projectId * @param {ContextFactories} context - Global GraphQL context with factories * @returns {Promise} */ diff --git a/src/resolvers/user.ts b/src/resolvers/user.ts index bfe663c5..e4ee66a2 100644 --- a/src/resolvers/user.ts +++ b/src/resolvers/user.ts @@ -147,7 +147,7 @@ export default { try { const newPassword = await UserModel.generatePassword(); - + console.log(newPassword); await user.changePassword(newPassword); await emailNotification({ @@ -225,7 +225,7 @@ export default { { user, factories }: ResolverContextWithUser ): Promise { const foundUser = await factories.usersFactory.findById(user.id); - + console.log(newPassword); if (!foundUser) { throw new ApolloError('There is no user with such id'); } diff --git a/src/types/graphql.ts b/src/types/graphql.ts index f69cae3e..57cd71ec 100644 --- a/src/types/graphql.ts +++ b/src/types/graphql.ts @@ -4,7 +4,7 @@ import { GraphQLField } from 'graphql'; import ProjectsFactory from '../models/projectsFactory'; import PlansFactory from '../models/plansFactory'; import BusinessOperationsFactory from '../models/businessOperationsFactory'; -import ReleasesFactory from "../models/releaseFactory"; +import ReleasesFactory from '../models/releaseFactory'; /** * Resolver's Context argument From 94ed684304942934392e0b32a342cf1d7384285a Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sun, 16 Mar 2025 02:13:42 +0300 Subject: [PATCH 10/26] add project req --- src/typeDefs/release.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/typeDefs/release.ts b/src/typeDefs/release.ts index 9de864d7..dccf8b8a 100644 --- a/src/typeDefs/release.ts +++ b/src/typeDefs/release.ts @@ -46,6 +46,6 @@ export default gql` Fetch list of releases. If projectId is provided, fetch releases for the given project. """ - getReleases(projectId: ID): [Release]! + getReleases(projectId: ID!): [Release]! } `; From aac5d4d5012a573014e35ccdf92b34b4ca77bf82 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Sun, 16 Mar 2025 04:29:55 +0300 Subject: [PATCH 11/26] add releaseId to extract from db --- src/typeDefs/release.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/typeDefs/release.ts b/src/typeDefs/release.ts index dccf8b8a..e86a7704 100644 --- a/src/typeDefs/release.ts +++ b/src/typeDefs/release.ts @@ -20,6 +20,11 @@ export default gql` Release data """ type Release { + """ + Release ID + """ + _id: ID! + """ Release name """ From 433a6836ecd07fcf091b68b5b32284569b79f38d Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Mon, 17 Mar 2025 00:19:11 +0300 Subject: [PATCH 12/26] rm logs --- src/resolvers/user.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/resolvers/user.ts b/src/resolvers/user.ts index e4ee66a2..bfe663c5 100644 --- a/src/resolvers/user.ts +++ b/src/resolvers/user.ts @@ -147,7 +147,7 @@ export default { try { const newPassword = await UserModel.generatePassword(); - console.log(newPassword); + await user.changePassword(newPassword); await emailNotification({ @@ -225,7 +225,7 @@ export default { { user, factories }: ResolverContextWithUser ): Promise { const foundUser = await factories.usersFactory.findById(user.id); - console.log(newPassword); + if (!foundUser) { throw new ApolloError('There is no user with such id'); } From e15dec2c6757e6a3228e61c6cc56df827ef43a40 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 22:14:15 +0000 Subject: [PATCH 13/26] Bump version up to 1.1.16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f3b0fde..a0c255f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.15", + "version": "1.1.16", "main": "index.ts", "license": "UNLICENSED", "scripts": { From 7e075c07487e45c773ead921779b45041643d250 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Mon, 17 Mar 2025 01:51:50 +0300 Subject: [PATCH 14/26] merge release with project --- src/resolvers/index.js | 2 -- src/resolvers/project.js | 20 ++++++++++++++ src/resolvers/release.ts | 25 ------------------ src/typeDefs/event.ts | 32 ++++++++++++++++++++++- src/typeDefs/index.ts | 2 -- src/typeDefs/project.ts | 5 ++++ src/typeDefs/release.ts | 56 ---------------------------------------- 7 files changed, 56 insertions(+), 86 deletions(-) delete mode 100644 src/resolvers/release.ts delete mode 100644 src/typeDefs/release.ts diff --git a/src/resolvers/index.js b/src/resolvers/index.js index 3d064140..28589515 100644 --- a/src/resolvers/index.js +++ b/src/resolvers/index.js @@ -17,7 +17,6 @@ const userNotifications = require('./userNotifications').default; const billing = require('./billingNew').default; const EncodedJSON = require('./encodedJSON').default; const seed = require('./seed').default; -const release = require('./release').default; /** * @typedef ResolverObj @@ -75,7 +74,6 @@ const resolvers = [ userNotifications, plans, billing, - release, ]; if (isE2E) { diff --git a/src/resolvers/project.js b/src/resolvers/project.js index 9c0ada37..7ee49940 100644 --- a/src/resolvers/project.js +++ b/src/resolvers/project.js @@ -265,6 +265,26 @@ module.exports = { return event; }, + /** + * Returns project releases + * + * @param {ProjectDBScheme} project - result of parent resolver + * @param {ContextFactories} context - Global GraphQL context with factories + * @returns {Promise} + */ + async releases(project, _, { factories }) { + if (!project._id) { + throw new Error('projectId is required to fetch releases'); + } + + try { + return await factories.releasesFactory.findManyByProjectId(project._id.toString()); + } catch (error) { + console.error('Error fetching releases:', error); + throw new Error('Failed to get the releases'); + } + }, + /** * Find project events * diff --git a/src/resolvers/release.ts b/src/resolvers/release.ts deleted file mode 100644 index 3248eb7d..00000000 --- a/src/resolvers/release.ts +++ /dev/null @@ -1,25 +0,0 @@ -import ReleasesFactory from '../models/releaseFactory'; - -export default { - Query: { - /** - * Fetch releases by projectId - * @param {ResolverObj} _ - Parent object, not used - * @param {ResolverArgs} args - Query arguments containing required projectId - * @param {ContextFactories} context - Global GraphQL context with factories - * @returns {Promise} - */ - getReleases: async (_: any, args: { projectId: string }, { factories }: any) => { - if (!args.projectId) { - throw new Error('projectId is required to fetch releases'); - } - - try { - return await factories.releasesFactory.findManyByProjectId(args.projectId); - } catch (error) { - console.error('Error fetching releases:', error); - throw new Error('Failed to get the releases'); - } - }, - }, -}; diff --git a/src/typeDefs/event.ts b/src/typeDefs/event.ts index 8d609a52..f051416a 100644 --- a/src/typeDefs/event.ts +++ b/src/typeDefs/event.ts @@ -16,6 +16,21 @@ type SourceCodeLine { content: String } +""" +Source map file details +""" +type SourceMapData { + """ + Source map filename + """ + mapFileName: String! + + """ + Original source filename + """ + originFileName: String! +} + """ Release commit """ @@ -42,18 +57,33 @@ type Commit { } """ -Release data of the corresponding event +Release data """ type Release { + """ + Release ID + """ + id: ID! @renameFrom(name: "_id") + """ Release name """ releaseName: String! @renameFrom(name: "release") + """ + Project ID associated with the release + """ + projectId: ID! + """ Release commits """ commits: [Commit!]! + + """ + Source maps associated with the release + """ + files: [SourceMapData!]! } """ diff --git a/src/typeDefs/index.ts b/src/typeDefs/index.ts index d9d666d0..117b64e4 100644 --- a/src/typeDefs/index.ts +++ b/src/typeDefs/index.ts @@ -15,7 +15,6 @@ import workspaceMutations from './workspaceMutations'; import chart from './chart'; import plans from './plans'; import seed from './seed'; -import release from './release'; import isE2E from '../utils/isE2E'; const rootSchema = gql` @@ -99,7 +98,6 @@ const typeDefinitions = [ workspaceMutations, chart, plans, - release, ]; if (isE2E) { diff --git a/src/typeDefs/project.ts b/src/typeDefs/project.ts index 2bac1daa..c59f5669 100644 --- a/src/typeDefs/project.ts +++ b/src/typeDefs/project.ts @@ -109,6 +109,11 @@ type Project { skip: Int = 0 ): [Event!] + """ + Project releases + """ + releases: [Release!]! + """ Returns recent events grouped by day """ diff --git a/src/typeDefs/release.ts b/src/typeDefs/release.ts deleted file mode 100644 index e86a7704..00000000 --- a/src/typeDefs/release.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { gql } from 'apollo-server-express'; - -export default gql` - """ - Source map file details - """ - type SourceMapData { - """ - Source map filename - """ - mapFileName: String! - - """ - Original source filename - """ - originFileName: String! - } - - """ - Release data - """ - type Release { - """ - Release ID - """ - _id: ID! - - """ - Release name - """ - release: String! - - """ - Project ID associated with the release - """ - projectId: ID! - - """ - Release commits - """ - commits: [Commit!] - - """ - Source maps associated with the release - """ - files: [SourceMapData!]! - } - - extend type Query { - """ - Fetch list of releases. - If projectId is provided, fetch releases for the given project. - """ - getReleases(projectId: ID!): [Release]! - } -`; From f6e5c26ed3d8f39a083808e0747de4d913fb7e5c Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Mon, 17 Mar 2025 01:57:07 +0300 Subject: [PATCH 15/26] Update project.js --- src/resolvers/project.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resolvers/project.js b/src/resolvers/project.js index 7ee49940..f153038b 100644 --- a/src/resolvers/project.js +++ b/src/resolvers/project.js @@ -267,7 +267,7 @@ module.exports = { /** * Returns project releases - * + * * @param {ProjectDBScheme} project - result of parent resolver * @param {ContextFactories} context - Global GraphQL context with factories * @returns {Promise} From 6d8ceaeaf4354eda24dc67d2b1356a9a113c7e36 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Mon, 17 Mar 2025 03:31:26 +0300 Subject: [PATCH 16/26] add logic to find filesize --- src/models/releaseFactory.ts | 54 +++++++++++++++++++++++++++++++++--- src/typeDefs/event.ts | 5 ++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index 4cee0b14..70f7921d 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -1,7 +1,11 @@ -import { Collection, Db } from 'mongodb'; -import { ReleaseDBScheme } from '@hawk.so/types'; +import { Collection, Db, ObjectId } from 'mongodb'; +import { ReleaseDBScheme, SourceMapFileChunk } from '@hawk.so/types'; import DataLoaders from '../dataLoaders'; +interface ReleaseWithFileDetails extends ReleaseDBScheme { + fileDetails?: SourceMapFileChunk[]; +} + export default class ReleasesFactory { /** * Releases collection @@ -37,12 +41,54 @@ export default class ReleasesFactory { } /** - * Get releases by project identifier + * Get releases by project identifier with file sizes * @param projectId - project identifier */ public async findManyByProjectId(projectId: string): Promise { try { - return await this.collection.find({ projectId: projectId }).toArray(); + const releases = await this.collection.aggregate([ + { + $match: { + projectId: projectId + } + }, + { + $lookup: { + from: 'releases.files', + let: { fileIds: '$files._id' }, + pipeline: [ + { + $match: { + $expr: { + $in: ['$_id', '$$fileIds'] + } + } + }, + { + $project: { + _id: 1, + length: 1, + chunkSize: 1 + } + } + ], + as: 'fileDetails' + } + } + ]).toArray(); + + return releases.map(release => ({ + ...release, + files: release.files?.map(file => { + const fileDetail = release.fileDetails?.find( + (detail: SourceMapFileChunk) => detail._id.toString() === file._id?.toString() + ); + return { + ...file, + size: fileDetail ? fileDetail.length : 0 + }; + }) + })); } catch (error) { console.error(`[ReleasesFactory] Error in findManyByProjectId:`, error); throw error; diff --git a/src/typeDefs/event.ts b/src/typeDefs/event.ts index f051416a..63141971 100644 --- a/src/typeDefs/event.ts +++ b/src/typeDefs/event.ts @@ -29,6 +29,11 @@ type SourceMapData { Original source filename """ originFileName: String! + + """ + File size in bytes + """ + size: Int! } """ From d331a5eacc14c483367c2aa68c7c983478543b77 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Mon, 17 Mar 2025 03:43:44 +0300 Subject: [PATCH 17/26] linter --- src/models/releaseFactory.ts | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index 70f7921d..c4eb33eb 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -47,10 +47,10 @@ export default class ReleasesFactory { public async findManyByProjectId(projectId: string): Promise { try { const releases = await this.collection.aggregate([ - { - $match: { - projectId: projectId - } + { + $match: { + projectId: projectId, + }, }, { $lookup: { @@ -60,21 +60,21 @@ export default class ReleasesFactory { { $match: { $expr: { - $in: ['$_id', '$$fileIds'] - } - } + $in: ['$_id', '$$fileIds'], + }, + }, }, { $project: { _id: 1, length: 1, - chunkSize: 1 - } - } + chunkSize: 1, + }, + }, ], - as: 'fileDetails' - } - } + as: 'fileDetails', + }, + }, ]).toArray(); return releases.map(release => ({ @@ -83,11 +83,12 @@ export default class ReleasesFactory { const fileDetail = release.fileDetails?.find( (detail: SourceMapFileChunk) => detail._id.toString() === file._id?.toString() ); + return { ...file, - size: fileDetail ? fileDetail.length : 0 + size: fileDetail ? fileDetail.length : 0, }; - }) + }), })); } catch (error) { console.error(`[ReleasesFactory] Error in findManyByProjectId:`, error); From de5d3396d34fa4c55de7699987a56cd18a2a6149 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:01:55 +0000 Subject: [PATCH 18/26] Bump version up to 1.1.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a0c255f1..d4f80e01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.16", + "version": "1.1.17", "main": "index.ts", "license": "UNLICENSED", "scripts": { From bb1f812e2b7e6ba8a74b80016d9509cfb555d145 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Wed, 19 Mar 2025 18:06:06 +0300 Subject: [PATCH 19/26] rm redunant --- src/models/releaseFactory.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index c4eb33eb..7cb7afb3 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -27,19 +27,6 @@ export default class ReleasesFactory { this.dataLoaders = dataLoaders; } - /** - * Get a release by its identifier using DataLoader - * @param releaseId - release identifier - */ - public async findById(releaseId: string): Promise { - try { - return await this.dataLoaders.releaseById.load(releaseId); - } catch (error) { - console.error(`[ReleasesFactory] Error in findById:`, error); - throw error; - } - } - /** * Get releases by project identifier with file sizes * @param projectId - project identifier From e6296073547269b38bda3104ca92be319aedc998 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Wed, 19 Mar 2025 18:22:41 +0300 Subject: [PATCH 20/26] new type release --- src/typeDefs/event.ts | 75 --------------------------------------- src/typeDefs/index.ts | 2 ++ src/typeDefs/release.ts | 78 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 75 deletions(-) create mode 100644 src/typeDefs/release.ts diff --git a/src/typeDefs/event.ts b/src/typeDefs/event.ts index 63141971..ef5e45fb 100644 --- a/src/typeDefs/event.ts +++ b/src/typeDefs/event.ts @@ -16,81 +16,6 @@ type SourceCodeLine { content: String } -""" -Source map file details -""" -type SourceMapData { - """ - Source map filename - """ - mapFileName: String! - - """ - Original source filename - """ - originFileName: String! - - """ - File size in bytes - """ - size: Int! -} - -""" -Release commit -""" -type Commit { - """ - Hash of the commit - """ - hash: String! - - """ - Commit author - """ - author: String! - - """ - Commit title - """ - title: String! - - """ - Commit creation date - """ - date: DateTime! -} - -""" -Release data -""" -type Release { - """ - Release ID - """ - id: ID! @renameFrom(name: "_id") - - """ - Release name - """ - releaseName: String! @renameFrom(name: "release") - - """ - Project ID associated with the release - """ - projectId: ID! - - """ - Release commits - """ - commits: [Commit!]! - - """ - Source maps associated with the release - """ - files: [SourceMapData!]! -} - """ Event backtrace representation """ diff --git a/src/typeDefs/index.ts b/src/typeDefs/index.ts index 117b64e4..d9d666d0 100644 --- a/src/typeDefs/index.ts +++ b/src/typeDefs/index.ts @@ -15,6 +15,7 @@ import workspaceMutations from './workspaceMutations'; import chart from './chart'; import plans from './plans'; import seed from './seed'; +import release from './release'; import isE2E from '../utils/isE2E'; const rootSchema = gql` @@ -98,6 +99,7 @@ const typeDefinitions = [ workspaceMutations, chart, plans, + release, ]; if (isE2E) { diff --git a/src/typeDefs/release.ts b/src/typeDefs/release.ts new file mode 100644 index 00000000..c64a7594 --- /dev/null +++ b/src/typeDefs/release.ts @@ -0,0 +1,78 @@ +import { gql } from 'apollo-server-express'; + +export default gql` +""" +Source map file details +""" +type SourceMapData { + """ + Source map filename + """ + mapFileName: String! + + """ + Original source filename + """ + originFileName: String! + + """ + File size in bytes + """ + size: Int! +} + +""" +Release commit +""" +type Commit { + """ + Hash of the commit + """ + hash: String! + + """ + Commit author + """ + author: String! + + """ + Commit title + """ + title: String! + + """ + Commit creation date + """ + date: DateTime! +} + +""" +Release data +""" +type Release { + """ + Release ID + """ + id: ID! @renameFrom(name: "_id") + + """ + Release name + """ + releaseName: String! @renameFrom(name: "release") + + """ + Project ID associated with the release + """ + projectId: ID! + + """ + Release commits + """ + commits: [Commit!]! + + """ + Source maps associated with the release + """ + files: [SourceMapData!]! +} +`; \ No newline at end of file From a295cf308642ab29a9794a5b499f094d0dd5e40a Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Wed, 19 Mar 2025 18:27:10 +0300 Subject: [PATCH 21/26] rm tralingspace --- src/typeDefs/release.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/typeDefs/release.ts b/src/typeDefs/release.ts index c64a7594..99781f8e 100644 --- a/src/typeDefs/release.ts +++ b/src/typeDefs/release.ts @@ -75,4 +75,4 @@ type Release { """ files: [SourceMapData!]! } -`; \ No newline at end of file +`; \ No newline at end of file From 10d52ce3e358364ec6514bb50ad142b50ba3ca2f Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Wed, 19 Mar 2025 18:40:26 +0300 Subject: [PATCH 22/26] rm redunant --- src/dataLoaders.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/dataLoaders.ts b/src/dataLoaders.ts index e51e416b..0131aa0d 100644 --- a/src/dataLoaders.ts +++ b/src/dataLoaders.ts @@ -47,11 +47,6 @@ export default class DataLoaders { { cache: false } ); - public releaseById = new DataLoader( - (releaseIds) => this.batchByIds('releases', releaseIds), - { cache: false } - ); - /** * MongoDB connection to make queries */ From dcbc5b3c6a04b8e674cb3e037716283b7e1a611a Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Wed, 26 Mar 2025 14:54:44 +0300 Subject: [PATCH 23/26] rm redunant - rm redunant import - optimize triple nesting --- src/dataLoaders.ts | 2 +- src/models/releaseFactory.ts | 33 ++++++++++++++++++++------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/dataLoaders.ts b/src/dataLoaders.ts index 0131aa0d..6c696049 100644 --- a/src/dataLoaders.ts +++ b/src/dataLoaders.ts @@ -1,6 +1,6 @@ import DataLoader from 'dataloader'; import { Db, ObjectId } from 'mongodb'; -import { PlanDBScheme, UserDBScheme, WorkspaceDBScheme, ProjectDBScheme, ReleaseDBScheme } from '@hawk.so/types'; +import { PlanDBScheme, UserDBScheme, WorkspaceDBScheme, ProjectDBScheme } from '@hawk.so/types'; /** * Class for setting up data loaders diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index 7cb7afb3..93cd21fc 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -64,22 +64,29 @@ export default class ReleasesFactory { }, ]).toArray(); - return releases.map(release => ({ - ...release, - files: release.files?.map(file => { - const fileDetail = release.fileDetails?.find( - (detail: SourceMapFileChunk) => detail._id.toString() === file._id?.toString() - ); - - return { - ...file, - size: fileDetail ? fileDetail.length : 0, - }; - }), - })); + return releases.map(release => this.enrichReleaseWithFileSizes(release)); } catch (error) { console.error(`[ReleasesFactory] Error in findManyByProjectId:`, error); throw error; } } + + /** + * Enriches release with file sizes from file details + * @param release - release with file details + * @returns enriched release + */ + private enrichReleaseWithFileSizes(release: ReleaseWithFileDetails): ReleaseDBScheme { + const fileDetailsMap = new Map( + release.fileDetails?.map(detail => [detail._id.toString(), detail.length]) || [] + ); + + return { + ...release, + files: release.files?.map(file => ({ + ...file, + size: fileDetailsMap.get(file._id?.toString() || '') || 0, + })), + }; + } } From e75de965dce7dc8c72dd60c94e41f056b4c5c36a Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 12:09:14 +0000 Subject: [PATCH 24/26] Bump version up to 1.1.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 10a4f8c0..1b70044d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.1.17", + "version": "1.1.18", "main": "index.ts", "license": "UNLICENSED", "scripts": { From 1147bf83a0228e45fc549f8d8e6d8c741c3582f7 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Wed, 26 Mar 2025 15:14:59 +0300 Subject: [PATCH 25/26] rm redunant import --- src/models/releaseFactory.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index 93cd21fc..d04b4ad6 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -1,4 +1,4 @@ -import { Collection, Db, ObjectId } from 'mongodb'; +import { Collection, Db} from 'mongodb'; import { ReleaseDBScheme, SourceMapFileChunk } from '@hawk.so/types'; import DataLoaders from '../dataLoaders'; From 300a877ef2252438db6dfefd59129f5a66bf5e80 Mon Sep 17 00:00:00 2001 From: 3388ShubinPavel Date: Wed, 26 Mar 2025 15:35:17 +0300 Subject: [PATCH 26/26] Update releaseFactory.ts --- src/models/releaseFactory.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/releaseFactory.ts b/src/models/releaseFactory.ts index d04b4ad6..a80dd654 100644 --- a/src/models/releaseFactory.ts +++ b/src/models/releaseFactory.ts @@ -1,4 +1,4 @@ -import { Collection, Db} from 'mongodb'; +import { Collection, Db } from 'mongodb'; import { ReleaseDBScheme, SourceMapFileChunk } from '@hawk.so/types'; import DataLoaders from '../dataLoaders';