11import { ReceiveTypes } from '@hawk.so/types' ;
22import * as telegram from '../utils/telegram' ;
33const mongo = require ( '../mongo' ) ;
4+ const { ObjectId } = require ( 'mongodb' ) ;
45const { ApolloError, UserInputError } = require ( 'apollo-server-express' ) ;
56const Validator = require ( '../utils/validator' ) ;
67const EventsFactory = require ( '../models/eventsFactory' ) ;
@@ -454,11 +455,12 @@ module.exports = {
454455 * @param {DailyEventsCursor } cursor - object with boundary values of the first event in the next portion
455456 * @param {'BY_DATE' | 'BY_COUNT' } sort - events sort order
456457 * @param {EventsFilters } filters - marks by which events should be filtered
458+ * @param {String } release - release name
457459 * @param {String } search - search query
458460 *
459461 * @return {Promise<RecentEventSchema[]> }
460462 */
461- async dailyEventsPortion ( project , { limit, nextCursor, sort, filters, search } , context ) {
463+ async dailyEventsPortion ( project , { limit, nextCursor, sort, filters, search, release } , context ) {
462464 if ( search ) {
463465 if ( search . length > MAX_SEARCH_QUERY_LENGTH ) {
464466 search = search . slice ( 0 , MAX_SEARCH_QUERY_LENGTH ) ;
@@ -467,7 +469,7 @@ module.exports = {
467469
468470 const factory = getEventsFactory ( context , project . _id ) ;
469471
470- const dailyEventsPortion = await factory . findDailyEventsPortion ( limit , nextCursor , sort , filters , search ) ;
472+ const dailyEventsPortion = await factory . findDailyEventsPortion ( limit , nextCursor , sort , filters , search , release ) ;
471473
472474 return dailyEventsPortion ;
473475 } ,
@@ -561,5 +563,64 @@ module.exports = {
561563
562564 return result ;
563565 } ,
566+
567+ /**
568+ * Return detailed info for a specific release
569+ * @param {ProjectDBScheme } project
570+ * @param {Object } args
571+ * @param {string } args.release - release identifier
572+ */
573+ async releaseDetails ( project , { release } , { factories } ) {
574+ const releasesFactory = factories . releasesFactory ;
575+ const releaseDoc = await releasesFactory . findByProjectAndRelease ( project . _id , release ) ;
576+
577+ let enrichedFiles = Array . isArray ( releaseDoc . files ) ? releaseDoc . files : [ ] ;
578+
579+ // If there are files to enrich, try to get their metadata
580+ if ( enrichedFiles . length > 0 ) {
581+ try {
582+ const fileIds = [
583+ ...new Set ( enrichedFiles . map ( file => String ( file . _id ) ) ) ,
584+ ] . map ( id => new ObjectId ( id ) ) ;
585+
586+ if ( fileIds . length > 0 ) {
587+ const filesInfo = await factories . releasesFactory . findFilesByFileIds (
588+ fileIds
589+ ) ;
590+
591+ const metaById = new Map (
592+ filesInfo . map ( fileInfo => [ String ( fileInfo . _id ) , {
593+ length : fileInfo . length ,
594+ uploadDate : fileInfo . uploadDate ,
595+ } ] )
596+ ) ;
597+
598+ enrichedFiles = enrichedFiles . map ( ( entry ) => {
599+ const meta = metaById . get ( String ( entry . _id ) ) ;
600+
601+ return {
602+ mapFileName : entry . mapFileName ,
603+ originFileName : entry . originFileName ,
604+ length : meta . length ? meta . length : null ,
605+ uploadDate : meta . uploadDate ? meta . uploadDate : null ,
606+ } ;
607+ } ) ;
608+ }
609+ } catch ( e ) {
610+ // In case of any error with enrichment, fallback to original structure
611+ enrichedFiles = releaseDoc . files ? releaseDoc . files : [ ] ;
612+ }
613+ }
614+
615+ return {
616+ release,
617+ projectId : project . _id ,
618+ commitsCount : Array . isArray ( releaseDoc . commits ) ? releaseDoc . commits . length : 0 ,
619+ filesCount : Array . isArray ( releaseDoc . files ) ? releaseDoc . files . length : 0 ,
620+ commits : releaseDoc . commits ? releaseDoc . commits : [ ] ,
621+ files : enrichedFiles ,
622+ timestamp : releaseDoc . _id ? dateFromObjectId ( releaseDoc . _id ) : null ,
623+ } ;
624+ } ,
564625 } ,
565626} ;
0 commit comments