@@ -11,6 +11,7 @@ import { Domain, Service } from './types';
1111import { getMessageTypeUtils } from './utils/catalog-shorthand' ;
1212import { OpenAPI } from 'openapi-types' ;
1313import checkLicense from './utils/checkLicense' ;
14+ import * as semver from 'semver' ;
1415
1516type Props = {
1617 services : Service [ ] ;
@@ -32,6 +33,7 @@ export default async (_: any, options: Props) => {
3233 versionService,
3334 rmServiceById,
3435 writeService,
36+ writeVersionedService,
3537 addFileToService,
3638 getSpecificationFilesForService,
3739 } = utils ( process . env . PROJECT_DIR ) ;
@@ -53,9 +55,11 @@ export default async (_: any, options: Props) => {
5355 const version = document . info . version ;
5456
5557 const service = buildService ( serviceSpec , document ) ;
56- let serviceMarkdown = service . markdown ;
57- let serviceSpecificationsFiles = [ ] ;
58- let serviceSpecifications = service . specifications ;
58+ let isOldVersion = false ;
59+ let markdown = service . markdown ;
60+ let specFiles = [ ] ;
61+ let specifications = service . specifications ;
62+ let { sends, receives } = await processMessagesForOpenAPISpec ( serviceSpec . path , document ) ;
5963
6064 // Manage domain
6165 if ( options . domain ) {
@@ -91,64 +95,68 @@ export default async (_: any, options: Props) => {
9195 await addServiceToDomain ( domainId , { id : service . id , version : service . version } , domainVersion ) ;
9296 }
9397
94- // Process all messages for the OpenAPI spec
95- let { sends, receives } = await processMessagesForOpenAPISpec ( serviceSpec . path , document ) ;
96-
9798 // Check if service is already defined... if the versions do not match then create service.
9899 const latestServiceInCatalog = await getService ( service . id , 'latest' ) ;
100+ const existingVersionInCatalog = await getService ( service . id , version ) ;
101+
99102 console . log ( chalk . blue ( `Processing service: ${ document . info . title } (v${ version } )` ) ) ;
100103
104+ // Found a service, and versions do not match, we need to version the one already there
101105 if ( latestServiceInCatalog ) {
102- serviceMarkdown = latestServiceInCatalog . markdown ;
103- serviceSpecificationsFiles = await getSpecificationFilesForService ( service . id , 'latest' ) ;
104- sends = latestServiceInCatalog . sends || ( [ ] as any ) ;
105-
106- // persist any specifications that are already in the catalog
107- serviceSpecifications = {
108- ...serviceSpecifications ,
109- ...latestServiceInCatalog . specifications ,
110- } ;
111-
112- // Found a service, and versions do not match, we need to version the one already there
113- if ( latestServiceInCatalog . version !== version ) {
106+ if ( isHigherVersion ( version , latestServiceInCatalog . version ) ) {
114107 await versionService ( service . id ) ;
115108 console . log ( chalk . cyan ( ` - Versioned previous service (v${ latestServiceInCatalog . version } )` ) ) ;
109+ } else {
110+ isOldVersion = true ;
111+ console . log (
112+ chalk . yellow ( ` - Previous Service (v${ version } ) detected over newer version ${ latestServiceInCatalog . version } ...` )
113+ ) ;
116114 }
115+ }
116+
117+ if ( existingVersionInCatalog ) {
118+ markdown = existingVersionInCatalog . markdown ;
119+ specFiles = await getSpecificationFilesForService ( service . id , version ) ;
120+ sends = existingVersionInCatalog . sends || ( [ ] as any ) ;
121+ receives = [ ...( existingVersionInCatalog . receives ?? [ ] ) , ...receives ] ;
122+
123+ // persist any specifications that are already in the catalog
124+ specifications = {
125+ ...specifications ,
126+ ...existingVersionInCatalog . specifications ,
127+ } ;
117128
118129 // Match found, override it
119- if ( latestServiceInCatalog . version === version ) {
120- receives = latestServiceInCatalog . receives ? [ ...latestServiceInCatalog . receives , ...receives ] : receives ;
121- await rmServiceById ( service . id ) ;
122- }
130+ await rmServiceById ( service . id , version ) ;
123131 }
124132
125- await writeService (
133+ const choosenWriteServiceAction = isOldVersion ? writeVersionedService : writeService ;
134+ await choosenWriteServiceAction (
126135 {
127136 ...service ,
128- markdown : serviceMarkdown ,
129- specifications : serviceSpecifications ,
137+ markdown : markdown ,
138+ specifications : specifications ,
130139 sends,
131140 receives,
132141 } ,
133- { path : service . id }
134142 ) ;
135143
136144 // What files need added to the service (speficiation files)
137- const specFiles = [
145+ const existingSpecFiles = [
138146 // add any previous spec files to the list
139- ...serviceSpecificationsFiles ,
147+ ...specFiles ,
140148 {
141149 content : openAPIFile ,
142150 fileName : service . schemaPath ,
143151 } ,
144152 ] ;
145153
146- for ( const specFile of specFiles ) {
154+ for ( const spec of existingSpecFiles ) {
147155 await addFileToService (
148156 service . id ,
149157 {
150- fileName : specFile . fileName ,
151- content : specFile . content ,
158+ fileName : spec . fileName ,
159+ content : spec . content ,
152160 } ,
153161 version
154162 ) ;
@@ -235,3 +243,6 @@ const processMessagesForOpenAPISpec = async (pathToSpec: string, document: OpenA
235243 }
236244 return { receives, sends : [ ] } ;
237245} ;
246+ function isHigherVersion ( sourceVersion : string , targetVersion : string ) {
247+ return semver . gt ( sourceVersion , targetVersion ) ;
248+ }
0 commit comments