Skip to content

Commit 42e4d47

Browse files
releaser logic
1 parent 63b6f03 commit 42e4d47

File tree

5 files changed

+154
-7
lines changed

5 files changed

+154
-7
lines changed

src/dataLoaders.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import DataLoader from 'dataloader';
22
import { Db, ObjectId } from 'mongodb';
3-
import { PlanDBScheme, UserDBScheme, WorkspaceDBScheme, ProjectDBScheme } from '@hawk.so/types';
3+
import { PlanDBScheme, UserDBScheme, WorkspaceDBScheme, ProjectDBScheme, ReleaseDBScheme } from '@hawk.so/types';
44

55
/**
66
* Class for setting up data loaders
@@ -47,6 +47,11 @@ export default class DataLoaders {
4747
{ cache: false }
4848
);
4949

50+
public releaseById = new DataLoader<string, ReleaseDBScheme | null>(
51+
(releaseIds) => this.batchByIds<ReleaseDBScheme>('releases', releaseIds),
52+
{ cache: false }
53+
);
54+
5055
/**
5156
* MongoDB connection to make queries
5257
*/

src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import PlansFactory from './models/plansFactory';
2626
import BusinessOperationsFactory from './models/businessOperationsFactory';
2727
import schema from './schema';
2828
import { graphqlUploadExpress } from 'graphql-upload';
29+
import ReleasesFactory from './models/releaseFactory';
2930

3031
/**
3132
* Option to enable playground
@@ -145,12 +146,16 @@ class HawkAPI {
145146
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
146147
const businessOperationsFactory = new BusinessOperationsFactory(mongo.databases.hawk!, dataLoaders);
147148

149+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
150+
const releasesFactory = new ReleasesFactory(mongo.databases.hawk!, dataLoaders);
151+
148152
return {
149153
usersFactory,
150154
workspacesFactory,
151155
projectsFactory,
152156
plansFactory,
153157
businessOperationsFactory,
158+
releasesFactory,
154159
};
155160
}
156161

src/models/releaseFactory.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { Collection, Db } from 'mongodb';
2+
import { ReleaseDBScheme } from '@hawk.so/types';
3+
import DataLoaders from '../dataLoaders';
4+
5+
export default class ReleasesFactory {
6+
/**
7+
* Коллекция релизов
8+
*/
9+
private collection: Collection<ReleaseDBScheme>;
10+
11+
/**
12+
* DataLoader для релизов
13+
*/
14+
private dataLoaders: DataLoaders;
15+
16+
/**
17+
* Создаёт экземпляр фабрики релизов
18+
* @param dbConnection - подключение к базе данных
19+
* @param dataLoaders - экземпляр DataLoaders для батчинга запросов
20+
*/
21+
constructor(dbConnection: Db, dataLoaders: DataLoaders) {
22+
this.collection = dbConnection.collection('releases');
23+
this.dataLoaders = dataLoaders;
24+
}
25+
26+
/**
27+
* Получить релиз по его идентификатору с использованием DataLoader
28+
* @param id - идентификатор релиза
29+
*/
30+
public async getReleaseById(id: string): Promise<ReleaseDBScheme | null> {
31+
return this.dataLoaders.releaseById.load(id);
32+
}
33+
34+
/**
35+
* Получить все релизы
36+
*/
37+
public async getAllReleases(): Promise<ReleaseDBScheme[]> {
38+
return this.collection.find({}).toArray();
39+
}
40+
41+
/**
42+
* Получить релизы с пагинацией
43+
* @param page - номер страницы (начиная с 1)
44+
* @param limit - количество элементов на страницу
45+
*/
46+
public async getReleasesPaginated(page: number, limit: number): Promise<ReleaseDBScheme[]> {
47+
const skip = (page - 1) * limit;
48+
return this.collection.find({}).skip(skip).limit(limit).toArray();
49+
}
50+
51+
/**
52+
* Получить релизы по идентификатору проекта
53+
* @param projectId - идентификатор проекта
54+
*/
55+
public async getReleasesByProjectId(projectId: string): Promise<ReleaseDBScheme[]> {
56+
return this.collection.find({ projectId }).toArray();
57+
}
58+
}

src/typeDefs/release.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import { gql } from 'apollo-server-express';
2+
3+
export default gql`
4+
"""
5+
Release commit
6+
"""
7+
type Commit {
8+
"""
9+
Hash of the commit
10+
"""
11+
hash: String!
12+
13+
"""
14+
Commit author
15+
"""
16+
author: String!
17+
18+
"""
19+
Commit title
20+
"""
21+
title: String!
22+
23+
"""
24+
Commit creation date
25+
"""
26+
date: DateTime!
27+
}
28+
29+
"""
30+
Source map file details
31+
"""
32+
type SourceMapData {
33+
"""
34+
Source map filename
35+
"""
36+
mapFileName: String!
37+
38+
"""
39+
Original source filename
40+
"""
41+
originFileName: String!
42+
}
43+
44+
"""
45+
Release data
46+
"""
47+
type Release {
48+
"""
49+
Release name
50+
"""
51+
releaseName: String! @renameFrom(name: "release")
52+
53+
"""
54+
Project ID associated with the release
55+
"""
56+
projectId: ID!
57+
58+
"""
59+
Release commits
60+
"""
61+
commits: [Commit!]!
62+
63+
"""
64+
Source maps associated with the release
65+
"""
66+
files: [SourceMapData!]!
67+
}
68+
69+
"""
70+
Queries related to releases
71+
"""
72+
extend type Query {
73+
"""
74+
Fetch list of releases.
75+
If projectId is provided, fetch releases for the given project.
76+
"""
77+
getReleases(projectId: ID): [Release]!
78+
}
79+
`;

src/types/graphql.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import UsersFactory from '../models/usersFactory';
22
import WorkspacesFactory from '../models/workspacesFactory';
33
import { GraphQLField } from 'graphql';
44
import ProjectsFactory from '../models/projectsFactory';
5-
// import Accounting from 'codex-accounting-sdk';
65
import PlansFactory from '../models/plansFactory';
76
import BusinessOperationsFactory from '../models/businessOperationsFactory';
7+
import ReleasesFactory from "../models/releaseFactory";
88

99
/**
1010
* Resolver's Context argument
@@ -19,11 +19,6 @@ export interface ResolverContextBase {
1919
* Factories for working with models
2020
*/
2121
factories: ContextFactories;
22-
23-
// /**
24-
// * SDK for working with CodeX Accounting API
25-
// */
26-
// accounting: Accounting;
2722
}
2823

2924
/**
@@ -79,6 +74,11 @@ export interface ContextFactories {
7974
* Allows to work with the Business Operations models
8075
*/
8176
businessOperationsFactory: BusinessOperationsFactory;
77+
78+
/**
79+
* Allows to work with releases
80+
*/
81+
releasesFactory: ReleasesFactory;
8282
}
8383

8484
/**

0 commit comments

Comments
 (0)