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
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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
--- /dev/null
+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;
+}