Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
42e4d47
releaser logic
3388ShubinPavel Mar 14, 2025
83636d1
add release to resolvers andtypedefs
3388ShubinPavel Mar 14, 2025
c34e2d5
rm release comms
3388ShubinPavel Mar 15, 2025
7a787a9
add logs
3388ShubinPavel Mar 15, 2025
4dcfda0
change db
3388ShubinPavel Mar 15, 2025
0cd1107
Bump version up to 1.1.15
github-actions[bot] Mar 15, 2025
111dc39
add comms in graphql and translate to eng
3388ShubinPavel Mar 15, 2025
f37f071
rm useless
3388ShubinPavel Mar 15, 2025
6c1ea20
Merge branch 'feat-release' of https://github.com/codex-team/hawk.api…
3388ShubinPavel Mar 15, 2025
1e189e9
fix
3388ShubinPavel Mar 15, 2025
94ed684
add project req
3388ShubinPavel Mar 15, 2025
aac5d4d
add releaseId to extract from db
3388ShubinPavel Mar 16, 2025
433a683
rm logs
3388ShubinPavel Mar 16, 2025
982c813
Merge branch 'master' into feat-release
3388ShubinPavel Mar 16, 2025
e15dec2
Bump version up to 1.1.16
github-actions[bot] Mar 16, 2025
7e075c0
merge release with project
3388ShubinPavel Mar 16, 2025
f6e5c26
Update project.js
3388ShubinPavel Mar 16, 2025
6d8ceae
add logic to find filesize
3388ShubinPavel Mar 17, 2025
d331a5e
linter
3388ShubinPavel Mar 17, 2025
d7d6b33
Merge branch 'master' into feat-release
3388ShubinPavel Mar 19, 2025
de5d339
Bump version up to 1.1.17
github-actions[bot] Mar 19, 2025
bb1f812
rm redunant
3388ShubinPavel Mar 19, 2025
e629607
new type release
3388ShubinPavel Mar 19, 2025
a295cf3
rm tralingspace
3388ShubinPavel Mar 19, 2025
10d52ce
rm redunant
3388ShubinPavel Mar 19, 2025
dcbc5b3
rm redunant
3388ShubinPavel Mar 26, 2025
c240521
add grouping
3388ShubinPavel Mar 26, 2025
e75de96
Bump version up to 1.1.18
github-actions[bot] Mar 26, 2025
1147bf8
rm redunant import
3388ShubinPavel Mar 26, 2025
300a877
Update releaseFactory.ts
3388ShubinPavel Mar 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "hawk.api",
"version": "1.1.14",
"version": "1.1.15",
"main": "index.ts",
"license": "UNLICENSED",
"scripts": {
Expand Down
7 changes: 6 additions & 1 deletion src/dataLoaders.ts
Original file line number Diff line number Diff line change
@@ -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';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

redundant


/**
* Class for setting up data loaders
Expand Down Expand Up @@ -47,6 +47,11 @@ export default class DataLoaders {
{ cache: false }
);

public releaseById = new DataLoader<string, ReleaseDBScheme | null>(
(releaseIds) => this.batchByIds<ReleaseDBScheme>('releases', releaseIds),
{ cache: false }
);

/**
* MongoDB connection to make queries
*/
Expand Down
5 changes: 5 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.events!, dataLoaders);

return {
usersFactory,
workspacesFactory,
projectsFactory,
plansFactory,
businessOperationsFactory,
releasesFactory,
};
}

Expand Down
91 changes: 91 additions & 0 deletions src/models/releaseFactory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { Collection, Db } from 'mongodb';
import { ReleaseDBScheme } from '@hawk.so/types';
import DataLoaders from '../dataLoaders';

export default class ReleasesFactory {
/**
* Коллекция релизов
*/
private collection: Collection<ReleaseDBScheme>;

/**
* DataLoader для релизов
*/
private dataLoaders: DataLoaders;

/**
* Создаёт экземпляр фабрики релизов
* @param dbConnection - подключение к базе данных
* @param dataLoaders - экземпляр DataLoaders для батчинга запросов
*/
constructor(dbConnection: Db, dataLoaders: DataLoaders) {
this.collection = dbConnection.collection('releases');
this.dataLoaders = dataLoaders;
console.log("[ReleasesFactory] Initialized with collection 'releases'");
}

/**
* Получить релиз по его идентификатору с использованием DataLoader
* @param id - идентификатор релиза
*/
public async getReleaseById(id: string): Promise<ReleaseDBScheme | null> {
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<ReleaseDBScheme[]> {
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;
}
}

/**
* Получить релизы с пагинацией
* @param page - номер страницы (начиная с 1)
* @param limit - количество элементов на страницу
*/
public async getReleasesPaginated(page: number, limit: number): Promise<ReleaseDBScheme[]> {
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);
throw error;
}
}

/**
* Получить релизы по идентификатору проекта
* @param projectId - идентификатор проекта
*/
public async getReleasesByProjectId(projectId: string): Promise<ReleaseDBScheme[]> {
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;
}
}
}
2 changes: 2 additions & 0 deletions src/resolvers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -74,6 +75,7 @@ const resolvers = [
userNotifications,
plans,
billing,
release,
];

if (isE2E) {
Expand Down
24 changes: 24 additions & 0 deletions src/resolvers/release.ts
Original file line number Diff line number Diff line change
@@ -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<Release[]>}
*/
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('Не удалось получить релизы');
}
},
},
};
2 changes: 2 additions & 0 deletions src/typeDefs/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand Down Expand Up @@ -98,6 +99,7 @@ const typeDefinitions = [
workspaceMutations,
chart,
plans,
release,
];

if (isE2E) {
Expand Down
76 changes: 76 additions & 0 deletions src/typeDefs/release.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
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!]!
}
extend type Query {
"""
Fetch list of releases.
If projectId is provided, fetch releases for the given project.
"""
getReleases(projectId: ID): [Release]!
}
`;
12 changes: 6 additions & 6 deletions src/types/graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -19,11 +19,6 @@ export interface ResolverContextBase {
* Factories for working with models
*/
factories: ContextFactories;

// /**
// * SDK for working with CodeX Accounting API
// */
// accounting: Accounting;
}

/**
Expand Down Expand Up @@ -79,6 +74,11 @@ export interface ContextFactories {
* Allows to work with the Business Operations models
*/
businessOperationsFactory: BusinessOperationsFactory;

/**
* Allows to work with releases
*/
releasesFactory: ReleasesFactory;
}

/**
Expand Down