@@ -12,6 +12,7 @@ import { getMessageTypeUtils } from './utils/catalog-shorthand';
1212import { OpenAPI } from 'openapi-types' ;
1313import checkLicense from './utils/checkLicense' ;
1414import yaml from 'js-yaml' ;
15+ import * as semver from 'semver' ;
1516
1617type Props = {
1718 services : Service [ ] ;
@@ -34,6 +35,7 @@ export default async (_: any, options: Props) => {
3435 versionService,
3536 rmServiceById,
3637 writeService,
38+ writeVersionedService,
3739 addFileToService,
3840 getSpecificationFilesForService,
3941 } = utils ( process . env . PROJECT_DIR ) ;
@@ -54,9 +56,11 @@ export default async (_: any, options: Props) => {
5456 const version = document . info . version ;
5557
5658 const service = buildService ( serviceSpec , document ) ;
57- let serviceMarkdown = service . markdown ;
58- let serviceSpecificationsFiles = [ ] ;
59- let serviceSpecifications = service . specifications ;
59+ let isOldVersion = false ;
60+ let markdown = service . markdown ;
61+ let specFiles = [ ] ;
62+ let specifications = service . specifications ;
63+ let { sends, receives } = await processMessagesForOpenAPISpec ( serviceSpec . path , document ) ;
6064
6165 // Manage domain
6266 if ( options . domain ) {
@@ -92,64 +96,68 @@ export default async (_: any, options: Props) => {
9296 await addServiceToDomain ( domainId , { id : service . id , version : service . version } , domainVersion ) ;
9397 }
9498
95- // Process all messages for the OpenAPI spec
96- let { sends, receives } = await processMessagesForOpenAPISpec ( serviceSpec . path , document ) ;
97-
9899 // Check if service is already defined... if the versions do not match then create service.
99100 const latestServiceInCatalog = await getService ( service . id , 'latest' ) ;
101+ const existingVersionInCatalog = await getService ( service . id , version ) ;
102+
100103 console . log ( chalk . blue ( `Processing service: ${ document . info . title } (v${ version } )` ) ) ;
101104
105+ // Found a service, and versions do not match, we need to version the one already there
102106 if ( latestServiceInCatalog ) {
103- serviceMarkdown = latestServiceInCatalog . markdown ;
104- serviceSpecificationsFiles = await getSpecificationFilesForService ( service . id , 'latest' ) ;
105- sends = latestServiceInCatalog . sends || ( [ ] as any ) ;
106-
107- // persist any specifications that are already in the catalog
108- serviceSpecifications = {
109- ...serviceSpecifications ,
110- ...latestServiceInCatalog . specifications ,
111- } ;
112-
113- // Found a service, and versions do not match, we need to version the one already there
114- if ( latestServiceInCatalog . version !== version ) {
107+ if ( isHigherVersion ( version , latestServiceInCatalog . version ) ) {
115108 await versionService ( service . id ) ;
116109 console . log ( chalk . cyan ( ` - Versioned previous service (v${ latestServiceInCatalog . version } )` ) ) ;
110+ } else {
111+ isOldVersion = true ;
112+ console . log (
113+ chalk . yellow ( ` - Previous Service (v${ version } ) detected over newer version ${ latestServiceInCatalog . version } ...` )
114+ ) ;
117115 }
116+ }
117+
118+ if ( existingVersionInCatalog ) {
119+ markdown = existingVersionInCatalog . markdown ;
120+ specFiles = await getSpecificationFilesForService ( service . id , version ) ;
121+ sends = existingVersionInCatalog . sends || ( [ ] as any ) ;
122+ receives = [ ...( existingVersionInCatalog . receives ?? [ ] ) , ...receives ] ;
123+
124+ // persist any specifications that are already in the catalog
125+ specifications = {
126+ ...specifications ,
127+ ...existingVersionInCatalog . specifications ,
128+ } ;
118129
119130 // Match found, override it
120- if ( latestServiceInCatalog . version === version ) {
121- receives = latestServiceInCatalog . receives ? [ ...latestServiceInCatalog . receives , ...receives ] : receives ;
122- await rmServiceById ( service . id ) ;
123- }
131+ await rmServiceById ( service . id , version ) ;
124132 }
125133
126- await writeService (
134+ const choosenWriteServiceAction = isOldVersion ? writeVersionedService : writeService ;
135+ await choosenWriteServiceAction (
127136 {
128137 ...service ,
129- markdown : serviceMarkdown ,
130- specifications : serviceSpecifications ,
138+ markdown : markdown ,
139+ specifications : specifications ,
131140 sends,
132141 receives,
133142 } ,
134- { path : service . id }
135143 ) ;
136144
137145 // What files need added to the service (speficiation files)
138- const specFiles = [
146+ const existingSpecFiles = [
139147 // add any previous spec files to the list
140- ...serviceSpecificationsFiles ,
148+ ...specFiles ,
141149 {
142150 content : saveParsedSpecFile ? getParsedSpecFile ( serviceSpec , document ) : await getRawSpecFile ( serviceSpec ) ,
143151 fileName : service . schemaPath ,
144152 } ,
145153 ] ;
146154
147- for ( const specFile of specFiles ) {
155+ for ( const spec of existingSpecFiles ) {
148156 await addFileToService (
149157 service . id ,
150158 {
151- fileName : specFile . fileName ,
152- content : specFile . content ,
159+ fileName : spec . fileName ,
160+ content : spec . content ,
153161 } ,
154162 version
155163 ) ;
@@ -243,3 +251,6 @@ const getParsedSpecFile = (service: Service, document: OpenAPI.Document) => {
243251} ;
244252
245253const getRawSpecFile = async ( service : Service ) => await readFile ( service . path , 'utf8' ) ;
254+ function isHigherVersion ( sourceVersion : string , targetVersion : string ) {
255+ return semver . gt ( sourceVersion , targetVersion ) ;
256+ }
0 commit comments