From ab67de9b8d2b16fdc580ee3205a7f0d7e447b326 Mon Sep 17 00:00:00 2001 From: Vikas Date: Thu, 8 Jan 2026 16:58:17 +0530 Subject: [PATCH] Prevent user to create serive extension request with previous dates from current expiry Signed-off-by: Vikas --- .../pac-go-server/services/backend_test.go | 29 ++++++++++++++++++- .../pkg/pac-go-server/services/request.go | 8 +++++ .../pac-go-server/services/request_test.go | 11 +++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/api/internal/pkg/pac-go-server/services/backend_test.go b/api/internal/pkg/pac-go-server/services/backend_test.go index c414323..22f73dd 100644 --- a/api/internal/pkg/pac-go-server/services/backend_test.go +++ b/api/internal/pkg/pac-go-server/services/backend_test.go @@ -376,7 +376,34 @@ func getResource(apiType string, customValues map[string]interface{}) interface{ }, ServiceExpiry: &models.ServiceExpiry{ Name: "test-service", - Expiry: time.Now().Add(3 * time.Hour), + Expiry: time.Now().Add(4 * time.Hour), + }, + } + // Update request with custom values if provided + for key, value := range customValues { + if fieldValue := reflect.ValueOf(&request).Elem().FieldByName(key); fieldValue.IsValid() { + if value != nil { + fieldValue.Set(reflect.ValueOf(value)) + } + } + } + return &request + case "get-request-by-id-before-expiry": + request := models.Request{ + ID: [12]byte{1}, + UserID: "12345", + Justification: "justification", + Comment: "comment", + CreatedAt: time.Time{}, + RequestType: "SERVICE_EXPIRY", + GroupAdmission: &models.GroupAdmission{ + GroupID: "test-group", + Group: "manager", + Requester: "test-user", + }, + ServiceExpiry: &models.ServiceExpiry{ + Name: "test-service", + Expiry: time.Now().Add(2 * time.Hour), }, } // Update request with custom values if provided diff --git a/api/internal/pkg/pac-go-server/services/request.go b/api/internal/pkg/pac-go-server/services/request.go index 9447dde..d58987f 100644 --- a/api/internal/pkg/pac-go-server/services/request.go +++ b/api/internal/pkg/pac-go-server/services/request.go @@ -134,6 +134,14 @@ func UpdateServiceExpiryRequest(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("Service %s is expired, can't extend the expiry", serviceName)}) return } + // requested expiry should be after current expiry + currentExpiry := service.Spec.Expiry.Time + requestedExpiry := expiryRequest.ServiceExpiry.Expiry + if requestedExpiry.Before(currentExpiry) { + logger.Error("Requested expiry date should be after the current expiry date") + c.JSON(http.StatusBadRequest, gin.H{"error": "Requested expiry date should be after the current expiry date"}) + return + } // service shouldn't be extended if catalog already retired catalog, err := kubeClient.GetCatalog(service.Spec.Catalog.Name) diff --git a/api/internal/pkg/pac-go-server/services/request_test.go b/api/internal/pkg/pac-go-server/services/request_test.go index 8d8dbf5..0ace75c 100644 --- a/api/internal/pkg/pac-go-server/services/request_test.go +++ b/api/internal/pkg/pac-go-server/services/request_test.go @@ -137,6 +137,17 @@ func TestUpdateServiceExpiryRequest(t *testing.T) { }), httpStatus: http.StatusBadRequest, }, + { + name: "service expiry request set before current expiry", + mockFunc: func() { + mockClient.EXPECT().GetService(gomock.Any()).Return(getResource("get-service", nil).(pac.Service), nil).Times(1) + }, + requestContext: formContext(customValues{ + "userid": "12345", + }), + httpStatus: http.StatusBadRequest, + request: getResource("get-request-by-id-before-expiry", nil).(*models.Request), + }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) {