Skip to content

Commit 85dfee6

Browse files
authored
Merge branch 'master' into TT-6613
2 parents a574b64 + 26c5240 commit 85dfee6

26 files changed

Lines changed: 5801 additions & 216 deletions
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name: PR Merge Suggestions
2+
on:
3+
pull_request:
4+
types:
5+
- opened
6+
- synchronize
7+
- reopened
8+
- ready_for_review
9+
10+
permissions:
11+
pull-requests: write
12+
contents: read
13+
14+
jobs:
15+
branch-suggestions:
16+
uses: TykTechnologies/github-actions/.github/workflows/branch-suggestion.yml@main
17+
secrets:
18+
JIRA_TOKEN: ${{ secrets.JIRA_TOKEN }}

.github/workflows/release-bot.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
name: Release bot
2+
3+
on:
4+
issue_comment:
5+
types: [created]
6+
7+
jobs:
8+
release_bot:
9+
uses: TykTechnologies/github-actions/.github/workflows/release-bot.yaml@main
10+
secrets:
11+
APP_ID: ${{ secrets.PROBE_APP_ID }}
12+
APP_PRIVATE_KEY: ${{ secrets.PROBE_APP_PRIVATE_KEY }}
13+
APP_INSTALLATION_ID: ${{ secrets.PROBE_APP_INSTALLATION_ID }}

apidef/api_definitions.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,27 @@ func (a *APIDefinition) GetAPIDomain() string {
14231423
return a.Domain
14241424
}
14251425

1426+
// IsChildAPI returns true if this API is a child API in a versioning hierarchy.
1427+
// A child API is identified by having a BaseID that differs from its own APIID.
1428+
func (a *APIDefinition) IsChildAPI() bool {
1429+
return a.VersionDefinition.BaseID != "" && a.VersionDefinition.BaseID != a.APIID
1430+
}
1431+
1432+
// IsBaseAPI returns true if this API is a base API with child versions.
1433+
// A base API is identified by having versions defined and either no BaseID or BaseID equal to its own APIID.
1434+
func (a *APIDefinition) IsBaseAPI() bool {
1435+
return len(a.VersionDefinition.Versions) > 0 &&
1436+
(a.VersionDefinition.BaseID == "" || a.VersionDefinition.BaseID == a.APIID)
1437+
}
1438+
1439+
// IsBaseAPIWithVersioning returns true if this API is a base API with versioning explicitly enabled.
1440+
// This is similar to IsBaseAPI but additionally requires versioning to be enabled and have a version name.
1441+
func (a *APIDefinition) IsBaseAPIWithVersioning() bool {
1442+
return a.VersionDefinition.Enabled &&
1443+
(a.VersionDefinition.BaseID == "" || a.VersionDefinition.BaseID == a.APIID) &&
1444+
a.VersionDefinition.Name != ""
1445+
}
1446+
14261447
func DummyAPI() APIDefinition {
14271448
endpointMeta := EndPointMeta{
14281449
Path: "abc",

apidef/api_definitions_test.go

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,3 +364,224 @@ func TestLogEventHandlerConf_Scan(t *testing.T) {
364364
assert.NoError(t, err)
365365
assert.Equal(t, expected, logEventConf)
366366
}
367+
368+
func TestAPIDefinition_IsChildAPI(t *testing.T) {
369+
tests := []struct {
370+
name string
371+
api APIDefinition
372+
expected bool
373+
}{
374+
{
375+
name: "child API - BaseID set and different from APIID",
376+
api: APIDefinition{
377+
APIID: "child-api-123",
378+
VersionDefinition: VersionDefinition{
379+
BaseID: "base-api-456",
380+
},
381+
},
382+
expected: true,
383+
},
384+
{
385+
name: "not a child - BaseID empty",
386+
api: APIDefinition{
387+
APIID: "standalone-api-123",
388+
VersionDefinition: VersionDefinition{
389+
BaseID: "",
390+
},
391+
},
392+
expected: false,
393+
},
394+
{
395+
name: "not a child - BaseID equals APIID (base API)",
396+
api: APIDefinition{
397+
APIID: "base-api-123",
398+
VersionDefinition: VersionDefinition{
399+
BaseID: "base-api-123",
400+
},
401+
},
402+
expected: false,
403+
},
404+
{
405+
name: "not a child - no version definition",
406+
api: APIDefinition{
407+
APIID: "api-123",
408+
VersionDefinition: VersionDefinition{},
409+
},
410+
expected: false,
411+
},
412+
}
413+
414+
for _, tt := range tests {
415+
t.Run(tt.name, func(t *testing.T) {
416+
result := tt.api.IsChildAPI()
417+
assert.Equal(t, tt.expected, result)
418+
})
419+
}
420+
}
421+
422+
func TestAPIDefinition_IsBaseAPI(t *testing.T) {
423+
tests := []struct {
424+
name string
425+
api APIDefinition
426+
expected bool
427+
}{
428+
{
429+
name: "base API - has versions and no BaseID",
430+
api: APIDefinition{
431+
APIID: "base-api-123",
432+
VersionDefinition: VersionDefinition{
433+
BaseID: "",
434+
Versions: map[string]string{
435+
"v1": "child-api-1",
436+
"v2": "child-api-2",
437+
},
438+
},
439+
},
440+
expected: true,
441+
},
442+
{
443+
name: "base API - has versions and BaseID equals APIID",
444+
api: APIDefinition{
445+
APIID: "base-api-123",
446+
VersionDefinition: VersionDefinition{
447+
BaseID: "base-api-123",
448+
Versions: map[string]string{
449+
"v1": "child-api-1",
450+
"v2": "child-api-2",
451+
},
452+
},
453+
},
454+
expected: true,
455+
},
456+
{
457+
name: "not a base API - no versions",
458+
api: APIDefinition{
459+
APIID: "api-123",
460+
VersionDefinition: VersionDefinition{
461+
BaseID: "",
462+
Versions: map[string]string{},
463+
},
464+
},
465+
expected: false,
466+
},
467+
{
468+
name: "not a base API - is a child (BaseID different from APIID)",
469+
api: APIDefinition{
470+
APIID: "child-api-123",
471+
VersionDefinition: VersionDefinition{
472+
BaseID: "base-api-456",
473+
Versions: map[string]string{
474+
"v1": "child-api-123",
475+
},
476+
},
477+
},
478+
expected: false,
479+
},
480+
{
481+
name: "not a base API - nil versions",
482+
api: APIDefinition{
483+
APIID: "api-123",
484+
VersionDefinition: VersionDefinition{
485+
BaseID: "",
486+
Versions: nil,
487+
},
488+
},
489+
expected: false,
490+
},
491+
}
492+
493+
for _, tt := range tests {
494+
t.Run(tt.name, func(t *testing.T) {
495+
result := tt.api.IsBaseAPI()
496+
assert.Equal(t, tt.expected, result)
497+
})
498+
}
499+
}
500+
501+
func TestAPIDefinition_IsBaseAPIWithVersioning(t *testing.T) {
502+
tests := []struct {
503+
name string
504+
api APIDefinition
505+
expected bool
506+
}{
507+
{
508+
name: "base API with versioning - all conditions met",
509+
api: APIDefinition{
510+
APIID: "base-api-123",
511+
VersionDefinition: VersionDefinition{
512+
Enabled: true,
513+
Name: "v1",
514+
BaseID: "",
515+
},
516+
},
517+
expected: true,
518+
},
519+
{
520+
name: "base API with versioning - BaseID equals APIID",
521+
api: APIDefinition{
522+
APIID: "base-api-123",
523+
VersionDefinition: VersionDefinition{
524+
Enabled: true,
525+
Name: "v1",
526+
BaseID: "base-api-123",
527+
},
528+
},
529+
expected: true,
530+
},
531+
{
532+
name: "not versioned - Enabled is false",
533+
api: APIDefinition{
534+
APIID: "api-123",
535+
VersionDefinition: VersionDefinition{
536+
Enabled: false,
537+
Name: "v1",
538+
BaseID: "",
539+
},
540+
},
541+
expected: false,
542+
},
543+
{
544+
name: "not versioned - Name is empty",
545+
api: APIDefinition{
546+
APIID: "api-123",
547+
VersionDefinition: VersionDefinition{
548+
Enabled: true,
549+
Name: "",
550+
BaseID: "",
551+
},
552+
},
553+
expected: false,
554+
},
555+
{
556+
name: "is a child API - BaseID different from APIID",
557+
api: APIDefinition{
558+
APIID: "child-api-123",
559+
VersionDefinition: VersionDefinition{
560+
Enabled: true,
561+
Name: "v2",
562+
BaseID: "base-api-456",
563+
},
564+
},
565+
expected: false,
566+
},
567+
{
568+
name: "not versioned - all fields false/empty",
569+
api: APIDefinition{
570+
APIID: "api-123",
571+
VersionDefinition: VersionDefinition{
572+
Enabled: false,
573+
Name: "",
574+
BaseID: "",
575+
},
576+
},
577+
expected: false,
578+
},
579+
}
580+
581+
for _, tt := range tests {
582+
t.Run(tt.name, func(t *testing.T) {
583+
result := tt.api.IsBaseAPIWithVersioning()
584+
assert.Equal(t, tt.expected, result)
585+
})
586+
}
587+
}

apidef/oas/default.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99
"slices"
1010
"strconv"
1111
"strings"
12-
13-
"github.com/getkin/kin-openapi/openapi3"
1412
)
1513

1614
const (
@@ -338,17 +336,3 @@ func getQueryValPtr(val string) *bool {
338336

339337
return &boolVal
340338
}
341-
342-
// RetainOldServerURL retains the first entry from old servers provided
343-
// tyk adds a server URL to the start of oas.Servers to add the gw URL
344-
// RetainOldServerURL can be used when API def is patched.
345-
func RetainOldServerURL(oldServers, newServers openapi3.Servers) openapi3.Servers {
346-
if len(oldServers) > 0 && len(newServers) > 0 {
347-
if oldServers[0].URL == newServers[0].URL {
348-
return newServers
349-
}
350-
newServers = append(openapi3.Servers{oldServers[0]}, newServers...)
351-
}
352-
353-
return newServers
354-
}

0 commit comments

Comments
 (0)