@@ -18,6 +18,7 @@ package api
1818
1919import (
2020 "encoding/json"
21+ "github.com/Masterminds/semver"
2122 util "github.com/devtron-labs/central-api/client"
2223 "github.com/devtron-labs/central-api/common"
2324 "github.com/devtron-labs/central-api/pkg"
@@ -27,6 +28,7 @@ import (
2728 "io/ioutil"
2829 "net/http"
2930 "strconv"
31+ "strings"
3032)
3133
3234type RestHandler interface {
@@ -120,15 +122,18 @@ func (impl *RestHandlerImpl) GetReleases(w http.ResponseWriter, r *http.Request)
120122 size := 10
121123 var err error
122124 offsetQueryParam := r .URL .Query ().Get ("offset" )
123- if len (offsetQueryParam ) > 0 {
125+ sizeQueryParam := r .URL .Query ().Get ("size" )
126+ hasOffsetParam := len (offsetQueryParam ) > 0
127+ hasSizeParam := len (sizeQueryParam ) > 0
128+
129+ if hasOffsetParam {
124130 offset , err = strconv .Atoi (offsetQueryParam )
125131 if err != nil {
126132 impl .WriteJsonResp (w , err , "invalid offset" , http .StatusBadRequest )
127133 return
128134 }
129135 }
130- sizeQueryParam := r .URL .Query ().Get ("size" )
131- if len (sizeQueryParam ) > 0 {
136+ if hasSizeParam {
132137 size , err = strconv .Atoi (sizeQueryParam )
133138 if err != nil {
134139 impl .WriteJsonResp (w , err , "invalid size" , http .StatusBadRequest )
@@ -140,18 +145,40 @@ func (impl *RestHandlerImpl) GetReleases(w http.ResponseWriter, r *http.Request)
140145 if len (repo ) > 0 {
141146 repository = bean .Repository (repo )
142147 }
148+ serverVersion := r .URL .Query ().Get ("serverVersion" )
143149 //will fetch all the releases from cache and later apply size and offset filter
144150 response , err := impl .releaseNoteService .GetReleases (repository )
145151 if err != nil {
146152 impl .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
147153 return
148154 }
155+ if len (serverVersion ) > 0 {
156+ // get all releases of that version and above that version
157+ var filteredResponse []* common.Release
158+ for _ , release := range response {
159+ // Compare version strings - include matching version and newer versions
160+ if release .TagName == serverVersion || isVersionNewer (release .TagName , serverVersion ) {
161+ filteredResponse = append (filteredResponse , release )
162+ }
163+ }
164+ response = filteredResponse
149165
150- if size > 0 {
151- if offset + size <= len (response ) {
152- response = response [offset : offset + size ]
153- } else {
154- response = response [offset :]
166+ // If serverVersion is provided, only apply pagination if size are explicitly provided
167+ if hasSizeParam && size > 0 {
168+ if offset + size <= len (response ) {
169+ response = response [offset : offset + size ]
170+ } else {
171+ response = response [offset :]
172+ }
173+ }
174+ } else {
175+ // If serverVersion is not provided, apply pagination with default or provided values
176+ if size > 0 {
177+ if offset + size <= len (response ) {
178+ response = response [offset : offset + size ]
179+ } else {
180+ response = response [offset :]
181+ }
155182 }
156183 }
157184 if len (response ) == 0 {
@@ -230,3 +257,26 @@ func (impl *RestHandlerImpl) GetBuildpackMetadata(w http.ResponseWriter, r *http
230257 impl .WriteJsonResp (w , nil , buildpackMetadata , http .StatusOK )
231258 return
232259}
260+
261+ // isVersionNewer compares two version strings and returns true if v1 is newer than v2
262+ func isVersionNewer (v1 , v2 string ) bool {
263+ // Ensure 'v' prefix is present for semver parsing
264+ if ! strings .HasPrefix (v1 , "v" ) {
265+ v1 = "v" + v1
266+ }
267+ if ! strings .HasPrefix (v2 , "v" ) {
268+ v2 = "v" + v2
269+ }
270+
271+ // Parse versions
272+ ver1 , err1 := semver .NewVersion (v1 )
273+ ver2 , err2 := semver .NewVersion (v2 )
274+
275+ // Fall back to string comparison if parsing fails
276+ if err1 != nil || err2 != nil {
277+ return strings .TrimPrefix (v1 , "v" ) > strings .TrimPrefix (v2 , "v" )
278+ }
279+
280+ // Compare using semver
281+ return ver1 .GreaterThan (ver2 )
282+ }
0 commit comments