3GPP 28.532 RAN NSSMF subscribe API Implementation 77/15177/1
authorsunil.n <sunil.n@samsung.com>
Fri, 31 Oct 2025 08:27:12 +0000 (13:57 +0530)
committersunil.n <sunil.n@samsung.com>
Fri, 31 Oct 2025 08:27:12 +0000 (13:57 +0530)
Change-Id: I16a94207165803abfa0b3cd385c0d62b957daf80
Signed-off-by: sunil.n <sunil.n@samsung.com>
sample-rapp-generator/rapp-ran-nssmf-simulator/README.md
sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/controller/FileDataReportingMnSController.java [new file with mode: 0644]
sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionDTO.java [new file with mode: 0644]
sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionRequestDTO.java [new file with mode: 0644]

index 8b031a4..e9d7f2d 100644 (file)
@@ -2,7 +2,76 @@
 
 5G RAN NSSMF Simulator Rapp implements 5G RAN NSSMF Interfaces for subscriptions, NSSI creation, modifiction, get and delete apis according to 3GPP 28.532
 
+## API Documentation
+
+### File Data Reporting Subscription API
+
+#### Endpoint
+- **URL**: `http://localhost:8080/3GPPManagement/FileDataReportingMnS/v17.0.0/subscriptions`
+- **Method**: `POST`
+- **Content-Type**: `application/json`
+
+#### Request Body
+```json
+{
+  "consumerReference": "https://callback-url.com/notifications"
+}
+```
+
+**Request Validation:**
+- `consumerReference` is required and cannot be null or empty
+- Must be a valid URL for receiving callback notifications
+
+#### Response
+**Status Code**: `201 Created`
+**Headers**: 
+- `Location`: URL of the created subscription resource
+
+**Response Body:**
+```json
+{
+  "consumerReference": "https://callback-url.com/notifications"
+}
+```
+
+#### Functionality
+- Creates a new subscription for file data reporting notifications
+- Generates a unique subscription ID automatically
+- Stores subscription details in memory
+- Returns the subscription location in the `Location` header
+- Logs all subscription operations for debugging
+
+#### Example Usage
+
+**cURL Command:**
+```bash
+curl -X POST \
+  http://localhost:8080/3GPPManagement/FileDataReportingMnS/v17.0.0/subscriptions \
+  -H 'Content-Type: application/json' \
+  -d '{
+    "consumerReference": "https://my-callback-service.com/webhook"
+  }'
+```
+
+**Example Response:**
+```http
+HTTP/1.1 201 Created
+Location: http://localhost:8080/3GPPManagement/FileDataReportingMnS/v17.0.0/subscriptions/1
+Content-Type: application/json
+
+{
+  "consumerReference": "https://my-callback-service.com/webhook"
+}
+```
+
+#### Implementation Details
+- **Subscription Storage**: In-memory HashMap (subscriptionMap)
+- **ID Generation**: Sequential integer starting from 1
+- **3GPP Version**: v17.0.0
+- **Server Port**: 8080
+- **Logging**: Comprehensive logging for all operations
+
 Directory Structure
 
 src - contains source code for the Rapp
-Dockerfile - contains instructions to build a Docker image for the Rapp
\ No newline at end of file
+Dockerfile - contains instructions to build a Docker image for the Rapp
diff --git a/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/controller/FileDataReportingMnSController.java b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/controller/FileDataReportingMnSController.java
new file mode 100644 (file)
index 0000000..273cdd0
--- /dev/null
@@ -0,0 +1,52 @@
+package org.oransc.ran.nssmf.simulator.controller;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.oransc.ran.nssmf.simulator.dto.SubscriptionDTO;
+import org.oransc.ran.nssmf.simulator.dto.SubscriptionRequestDTO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/3GPPManagement/FileDataReportingMnS/${mns.fileDataReporting.version}")
+@EnableScheduling
+@RequiredArgsConstructor
+public class FileDataReportingMnSController {
+
+    private static final Logger logger = LoggerFactory.getLogger(FileDataReportingMnSController.class);
+    
+    Map<Integer, SubscriptionRequestDTO> subscriptionMap = new HashMap<>();
+    static int subscriptionId = 0;
+
+    @PostMapping("/subscriptions")
+    public ResponseEntity<SubscriptionDTO> subscribe(HttpServletRequest httpRequest, @Valid @RequestBody SubscriptionRequestDTO request)
+            throws Exception {
+        logger.info("Received new subscription request: {}", request);
+        
+        subscriptionId = subscriptionId + 1;
+        logger.info("Generated subscription ID: {}", subscriptionId);
+        
+        subscriptionMap.put(subscriptionId, request);
+        logger.info("Stored subscription in map. Total subscriptions: {}", subscriptionMap.size());
+        
+        SubscriptionDTO subscriptionDTO = new SubscriptionDTO();
+        subscriptionDTO.setCallbackUri(request.getCallbackUri());
+        URI location = URI.create(httpRequest.getRequestURL().toString() + "/" + subscriptionId);
+        
+        logger.info("Successfully created subscription with ID: {} and callback URI: {}", 
+                   subscriptionId, request.getCallbackUri());
+        
+        return ResponseEntity.created(location).body(subscriptionDTO);
+    }
+}
diff --git a/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionDTO.java b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionDTO.java
new file mode 100644 (file)
index 0000000..6ae55e5
--- /dev/null
@@ -0,0 +1,16 @@
+package org.oransc.ran.nssmf.simulator.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Data
+public class SubscriptionDTO {
+    @JsonProperty("consumerReference")
+    private String callbackUri;
+}
\ No newline at end of file
diff --git a/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionRequestDTO.java b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionRequestDTO.java
new file mode 100644 (file)
index 0000000..421ed63
--- /dev/null
@@ -0,0 +1,19 @@
+package org.oransc.ran.nssmf.simulator.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Data
+public class SubscriptionRequestDTO {
+
+    @NotBlank(message = "Not allow null or empty to 'consumerReference'")
+    @JsonProperty("consumerReference")
+    private String callbackUri;
+}