1414 * limitations under the License.
1515 */
1616
17- import { APIHUB_API_COMPATIBILITY_KIND } from '../../consts'
17+ import { APIHUB_API_BWC_KIND , APIHUB_API_NO_BWC_KIND , ApihubApiCompatibilityKind } from '../../consts'
1818import { isObject , isValidHttpMethod } from '../../utils'
1919import { JsonPath } from '@netcracker/qubership-apihub-json-crawl'
2020import {
21- ApiCompatibilityKind ,
2221 ApiCompatibilityScope ,
2322 ApiCompatibilityScopeFunction ,
23+ BACKWARD_COMPATIBLE ,
24+ NOT_BACKWARD_COMPATIBLE ,
2425} from '@netcracker/qubership-apihub-api-diff'
25- import { ApihubApiCompatibilityKind } from '../../types'
26- import { getApiKind } from '../document'
27-
28- const convertApihubToApiCompatibilityKind = ( apihubApiKind : ApihubApiCompatibilityKind ) : ApiCompatibilityKind => {
29- switch ( apihubApiKind ) {
30- case APIHUB_API_COMPATIBILITY_KIND . BWC :
31- return ApiCompatibilityKind . BACKWARD_COMPATIBLE
32- case APIHUB_API_COMPATIBILITY_KIND . NO_BWC :
33- return ApiCompatibilityKind . NOT_BACKWARD_COMPATIBLE
34- default :
35- return ApiCompatibilityKind . BACKWARD_COMPATIBLE
36- }
37- }
38-
39- export const getApiCompatibilityKind = (
40- beforeJson : unknown ,
41- afterJson : unknown ,
42- beforeParentApiKind : ApihubApiCompatibilityKind ,
43- afterParentApiKind : ApihubApiCompatibilityKind ,
44- ) : ApiCompatibilityKind | undefined => {
45- const beforeKind = getApiKind ( beforeJson ) ?? beforeParentApiKind
46- const afterKind = getApiKind ( afterJson ) ?? afterParentApiKind
47-
48- if ( beforeKind === APIHUB_API_COMPATIBILITY_KIND . NO_BWC || afterKind === APIHUB_API_COMPATIBILITY_KIND . NO_BWC ) {
49- return convertApihubToApiCompatibilityKind ( APIHUB_API_COMPATIBILITY_KIND . NO_BWC )
26+ import { getApiKindProperty } from '../document'
27+ import { OpenAPIV3 } from 'openapi-types'
28+
29+ export const calculateOperationApiCompatibilityKind = (
30+ beforeOperationObject : OpenAPIV3 . OperationObject | undefined ,
31+ afterOperationObject : OpenAPIV3 . OperationObject | undefined ,
32+ beforeDefaultApiKind : ApihubApiCompatibilityKind ,
33+ afterDefaultApiKind : ApihubApiCompatibilityKind ,
34+ ) : ApiCompatibilityScope | undefined => {
35+ const beforeKind = getApiKindProperty ( beforeOperationObject , beforeDefaultApiKind )
36+ const afterKind = getApiKindProperty ( afterOperationObject , afterDefaultApiKind )
37+
38+ if ( beforeKind === APIHUB_API_NO_BWC_KIND || afterKind === APIHUB_API_NO_BWC_KIND ) {
39+ return NOT_BACKWARD_COMPATIBLE
5040 }
5141
52- if ( beforeKind === APIHUB_API_COMPATIBILITY_KIND . BWC && afterKind === APIHUB_API_COMPATIBILITY_KIND . BWC ) {
53- return convertApihubToApiCompatibilityKind ( APIHUB_API_COMPATIBILITY_KIND . BWC )
42+ if ( beforeKind === APIHUB_API_BWC_KIND && afterKind === APIHUB_API_BWC_KIND ) {
43+ return BACKWARD_COMPATIBLE
5444 }
55-
56- return undefined
5745}
5846
59- export const getMethodsApiCompatibilityKind = ( obj : unknown ) : ApiCompatibilityKind | undefined => {
60- if ( checkAllMethodsHaveSameApiKind ( obj , APIHUB_API_COMPATIBILITY_KIND . NO_BWC ) ) {
61- return convertApihubToApiCompatibilityKind ( APIHUB_API_COMPATIBILITY_KIND . NO_BWC )
47+ export const getMethodsApiCompatibilityKind = ( pathItemObject : OpenAPIV3 . PathItemObject ) : ApiCompatibilityScope | undefined => {
48+ if ( checkAllMethodsHaveSameApiKind ( pathItemObject , APIHUB_API_NO_BWC_KIND ) ) {
49+ return NOT_BACKWARD_COMPATIBLE
6250 }
6351
64- if ( checkAllMethodsHaveSameApiKind ( obj , APIHUB_API_COMPATIBILITY_KIND . BWC ) ) {
65- return convertApihubToApiCompatibilityKind ( APIHUB_API_COMPATIBILITY_KIND . BWC )
52+ if ( checkAllMethodsHaveSameApiKind ( pathItemObject , APIHUB_API_BWC_KIND ) ) {
53+ return BACKWARD_COMPATIBLE
6654 }
67-
68- return undefined
6955}
7056
71- const hasApiKind = ( obj : unknown , apiKind : string ) : boolean => {
72- return getApiKind ( obj ) === apiKind
57+ const hasApiKind = ( obj : OpenAPIV3 . OperationObject , apiKind : ApihubApiCompatibilityKind ) : boolean => {
58+ return getApiKindProperty ( obj ) === apiKind
7359}
7460
7561// If a path object is removed/added, we must ensure every HTTP method under it
7662// is explicitly marked NO_BWC before treating the change as risky.
77- const checkAllMethodsHaveSameApiKind = ( obj : unknown , apiKind : string ) : boolean => {
63+ const checkAllMethodsHaveSameApiKind = ( obj : OpenAPIV3 . PathItemObject , apiKind : ApihubApiCompatibilityKind ) : boolean => {
7864 if ( ! isObject ( obj ) ) {
7965 return false
8066 }
@@ -93,12 +79,12 @@ const PATH_ITEM_PATH_LENGTH = 2
9379const OPERATION_OBJECT_PATH_LENGTH = 3
9480
9581export const createApiKindChecker = (
96- prevApiKind : ApihubApiCompatibilityKind = APIHUB_API_COMPATIBILITY_KIND . BWC ,
97- currApiKind : ApihubApiCompatibilityKind = APIHUB_API_COMPATIBILITY_KIND . BWC ,
82+ prevDocumentApiKind : ApihubApiCompatibilityKind = APIHUB_API_BWC_KIND ,
83+ currDocumentApiKind : ApihubApiCompatibilityKind = APIHUB_API_BWC_KIND ,
9884) : ApiCompatibilityScopeFunction => {
99- const defaultApiCompatibilityKind = ( prevApiKind === APIHUB_API_COMPATIBILITY_KIND . NO_BWC || currApiKind === APIHUB_API_COMPATIBILITY_KIND . NO_BWC )
100- ? ApiCompatibilityKind . NOT_BACKWARD_COMPATIBLE
101- : ApiCompatibilityKind . BACKWARD_COMPATIBLE
85+ const defaultApiCompatibilityKind = ( prevDocumentApiKind === APIHUB_API_NO_BWC_KIND || currDocumentApiKind === APIHUB_API_NO_BWC_KIND )
86+ ? NOT_BACKWARD_COMPATIBLE
87+ : BACKWARD_COMPATIBLE
10288
10389 return (
10490 path ?: JsonPath ,
@@ -147,7 +133,10 @@ export const createApiKindChecker = (
147133 }
148134
149135 if ( pathLength === OPERATION_OBJECT_PATH_LENGTH ) {
150- return getApiCompatibilityKind ( beforeJson , afterJson , prevApiKind , currApiKind )
136+ const beforeOperationObject = beforeJson as OpenAPIV3 . OperationObject | undefined
137+ const afterOperationObject = afterJson as OpenAPIV3 . OperationObject | undefined
138+
139+ return calculateOperationApiCompatibilityKind ( beforeOperationObject , afterOperationObject , prevDocumentApiKind , currDocumentApiKind )
151140 }
152141
153142 return undefined
0 commit comments