Skip to content

Commit 2bebaf0

Browse files
committed
feat: add releaseDetails resolver
1 parent dee36aa commit 2bebaf0

File tree

3 files changed

+155
-3
lines changed

3 files changed

+155
-3
lines changed

src/models/eventsFactory.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ class EventsFactory extends Factory {
186186
* @param {'BY_DATE' | 'BY_COUNT'} sort - events sort order
187187
* @param {EventsFilters} filters - marks by which events should be filtered
188188
* @param {String} search - Search query
189+
* @param {String} release - release name
189190
*
190191
* @return {DaylyEventsPortionSchema}
191192
*/
@@ -194,7 +195,8 @@ class EventsFactory extends Factory {
194195
paginationCursor = null,
195196
sort = 'BY_DATE',
196197
filters = {},
197-
search = ''
198+
search = '',
199+
release
198200
) {
199201
if (typeof search !== 'string') {
200202
throw new Error('Search parameter must be a string');
@@ -314,6 +316,25 @@ class EventsFactory extends Factory {
314316
)
315317
: {};
316318

319+
// Filter by release if provided (coerce event payload release to string)
320+
const releaseFilter = release
321+
? {
322+
$expr: {
323+
$eq: [
324+
{
325+
$convert: {
326+
input: '$event.payload.release',
327+
to: 'string',
328+
onError: '',
329+
onNull: '',
330+
},
331+
},
332+
String(release),
333+
],
334+
},
335+
}
336+
: {};
337+
317338
pipeline.push(
318339
/**
319340
* Left outer join original event on groupHash field
@@ -350,6 +371,7 @@ class EventsFactory extends Factory {
350371
$match: {
351372
...matchFilter,
352373
...searchFilter,
374+
...releaseFilter,
353375
},
354376
},
355377
{ $limit: limit + 1 },

src/resolvers/project.js

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,11 +454,12 @@ module.exports = {
454454
* @param {DailyEventsCursor} cursor - object with boundary values of the first event in the next portion
455455
* @param {'BY_DATE' | 'BY_COUNT'} sort - events sort order
456456
* @param {EventsFilters} filters - marks by which events should be filtered
457+
* @param {String} release - release name
457458
* @param {String} search - search query
458459
*
459460
* @return {Promise<RecentEventSchema[]>}
460461
*/
461-
async dailyEventsPortion(project, { limit, nextCursor, sort, filters, search }, context) {
462+
async dailyEventsPortion(project, { limit, nextCursor, sort, filters, search, release }, context) {
462463
if (search) {
463464
if (search.length > MAX_SEARCH_QUERY_LENGTH) {
464465
search = search.slice(0, MAX_SEARCH_QUERY_LENGTH);
@@ -467,7 +468,7 @@ module.exports = {
467468

468469
const factory = getEventsFactory(context, project._id);
469470

470-
const dailyEventsPortion = await factory.findDailyEventsPortion(limit, nextCursor, sort, filters, search);
471+
const dailyEventsPortion = await factory.findDailyEventsPortion(limit, nextCursor, sort, filters, search, release);
471472

472473
return dailyEventsPortion;
473474
},
@@ -561,5 +562,44 @@ module.exports = {
561562

562563
return result;
563564
},
565+
566+
/**
567+
* Return detailed info for a specific release
568+
* @param {ProjectDBScheme} project
569+
* @param {Object} args
570+
* @param {string} args.release - release identifier
571+
*/
572+
async releaseDetails(project, { release }) {
573+
const releasesCollection = mongo.databases.events.collection('releases');
574+
575+
const releaseDoc = await releasesCollection.findOne({
576+
projectId: project._id.toString(),
577+
release: release,
578+
});
579+
580+
return {
581+
release,
582+
projectId: project._id,
583+
commitsCount: Array.isArray(releaseDoc?.commits) ? releaseDoc.commits.length : 0,
584+
filesCount: Array.isArray(releaseDoc?.files) ? releaseDoc.files.length : 0,
585+
commits: releaseDoc?.commits || [],
586+
files: releaseDoc?.files || [],
587+
timestamp: releaseDoc?._id ? dateFromObjectId(releaseDoc._id) : null,
588+
};
589+
},
590+
},
591+
592+
/**
593+
* Field resolvers for ProjectReleaseDetails
594+
*/
595+
ProjectReleaseDetails: {
596+
597+
/**
598+
* Reuse dailyEventsPortion for release details
599+
*/
600+
async dailyEventsPortion(parent, { limit, nextCursor, sort, filters, search }) {
601+
const factory = new EventsFactory(parent.projectId);
602+
return factory.findDailyEventsPortion(limit, nextCursor, sort, filters, search, parent.release);
603+
},
564604
},
565605
};

src/typeDefs/project.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,91 @@ type ProjectRelease {
155155
filesCount: Int!
156156
}
157157
158+
"""
159+
Source map file information
160+
"""
161+
type SourceMapDataExtended {
162+
"""
163+
Name of source-map file
164+
"""
165+
mapFileName: String!
166+
167+
"""
168+
Bundle or chunk name
169+
"""
170+
originFileName: String!
171+
}
172+
173+
"""
174+
Detailed info for a specific release
175+
"""
176+
type ProjectReleaseDetails {
177+
"""
178+
Release identifier
179+
"""
180+
release: String!
181+
182+
"""
183+
Number of commits in this release
184+
"""
185+
commitsCount: Int!
186+
187+
"""
188+
Number of files in this release
189+
"""
190+
filesCount: Int!
191+
192+
"""
193+
Release creation timestamp
194+
"""
195+
timestamp: Float!
196+
197+
"""
198+
Commits (from releases collection)
199+
"""
200+
commits: [Commit!]
201+
202+
"""
203+
Changed files (from releases collection)
204+
"""
205+
files: [SourceMapDataExtended!]
206+
207+
"""
208+
Portion of daily events for this release (same shape as Project.dailyEventsPortion)
209+
"""
210+
dailyEventsPortion(
211+
"""
212+
Maximum number of results
213+
"""
214+
limit: Int! = 50
215+
216+
"""
217+
Pointer to the first event of the portion that would be fetched
218+
"""
219+
nextCursor: DailyEventsCursorInput
220+
221+
"""
222+
Events sort order
223+
"""
224+
sort: EventsSortOrder = lastRepetitionTime
225+
226+
"""
227+
Event marks by which events should be filtered
228+
"""
229+
filters: EventsFiltersInput
230+
231+
"""
232+
Search query (for release label)
233+
"""
234+
search: String
235+
236+
"""
237+
Release label to filter events by payload.release
238+
"""
239+
release: String
240+
): DailyEventsPortion!
241+
}
242+
158243
"""
159244
Respose object with updated project and his id
160245
"""
@@ -282,6 +367,11 @@ type Project {
282367
Search query
283368
"""
284369
search: String
370+
371+
"""
372+
Release label to filter events by payload.release
373+
"""
374+
release: String
285375
): DailyEventsPortion
286376
287377
"""

0 commit comments

Comments
 (0)