Lwm2m controller swagger
This commit is contained in:
		
							parent
							
								
									fbdb7bf224
								
							
						
					
					
						commit
						e84fbdf654
					
				@ -142,6 +142,51 @@ public class ControllerConstants {
 | 
			
		||||
    protected static final String EVENT_DEBUG_RULE_NODE_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"DEBUG_RULE_NODE\"," + DEBUG_FILTER_OBJ + MARKDOWN_CODE_BLOCK_END;
 | 
			
		||||
    protected static final String EVENT_DEBUG_RULE_CHAIN_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"DEBUG_RULE_CHAIN\"," + DEBUG_FILTER_OBJ + MARKDOWN_CODE_BLOCK_END;
 | 
			
		||||
 | 
			
		||||
    protected static final String IS_BOOTSTRAP_SERVER_PARAM_DESCRIPTION = "A Boolean value representing the Server SecurityInfo for future Bootstrap client mode settings. Values: 'true' for Bootstrap Server; 'false' for Lwm2m Server. ";
 | 
			
		||||
    protected static final String DEVICE_WITH_DEVICE_CREDENTIALS_PARAM_DESCRIPTION =
 | 
			
		||||
            "   {\n\"class org.thingsboard.server.common.data.Device\":{\n" +
 | 
			
		||||
            "           \"id\": \"null\",\n" +
 | 
			
		||||
            "           \"createdTime\":0,\n" +
 | 
			
		||||
            "           \"additionalInfo\":\"null\",\n" +
 | 
			
		||||
            "           \"tenantId\":\"null\",\n" +
 | 
			
		||||
            "           \"customerId\":\"null\",\n" +
 | 
			
		||||
            "           \"name\":\"LwRpk00000000\",\n" +
 | 
			
		||||
            "           \"type\":\"lwm2mProfileRpk\",\n" +
 | 
			
		||||
            "           \"label\":\"null\",\"" +
 | 
			
		||||
            "           \"deviceProfileId\":\"null\",\n" +
 | 
			
		||||
            "           \"deviceData\":\"null\",\n" +
 | 
			
		||||
            "           \"firmwareId\":\"null\",\n" +
 | 
			
		||||
            "           \"softwareId\":\"null\"\n" +
 | 
			
		||||
            "       },\n" +
 | 
			
		||||
            "   \"class org.thingsboard.server.common.data.security.DeviceCredentials\":{\n" +
 | 
			
		||||
            "       \"class_DeviceCredentials1\":{\n" +
 | 
			
		||||
            "           \"id\":\"null\",\n" +
 | 
			
		||||
            "           \"createdTime\":0,\n" +
 | 
			
		||||
            "           \"deviceId\":\"null|',\n" +
 | 
			
		||||
            "           \"credentialsType\":\"LWM2M_CREDENTIALS\",\n" +
 | 
			
		||||
            "           \"credentialsId\":\"LwRpk00000000\",\n" +
 | 
			
		||||
            "           \"credentialsValue\":{\n" +
 | 
			
		||||
            "               \"client\":{\n" +
 | 
			
		||||
            "                   \"endpoint\":\"LwRpk00000000\",\n" +
 | 
			
		||||
            "                   \"securityConfigClientMode\":\"RPK\",\n" +
 | 
			
		||||
            "                   \"key\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUEBxNl/RcYJNm8mk91CyVXoIJiROYDlXcSSqK6e5bDHwOW4ZiN2lNnXalyF0Jxw8MbAytnDMERXyAja5VEMeVQ==\"\n" +
 | 
			
		||||
            "               },\n" +
 | 
			
		||||
            "               \"bootstrap\":{\n" +
 | 
			
		||||
            "                   \"bootstrapServer\":{\n" +
 | 
			
		||||
            "                       \"securityMode\":\"RPK\",\n" +
 | 
			
		||||
            "                       \"clientPublicKeyOrId\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUEBxNl/RcYJNm8mk91CyVXoIJiROYDlXcSSqK6e5bDHwOW4ZiN2lNnXalyF0Jxw8MbAytnDMERXyAja5VEMeVQ==\",\n" +
 | 
			
		||||
            "                       \"clientSecretKey\":\"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgd9GAx7yZW37autew5KZykn4IgRpge/tZSjnudnZJnMahRANCAARQQHE2X9Fxgk2byaT3ULJVeggmJE5gOVdxJKorp7lsMfA5bhmI3aU2ddqXIXQnHDwxsDK2cMwRFfICNrlUQx5V\"" +
 | 
			
		||||
            "                   },\n" +
 | 
			
		||||
            "                   \"lwm2mServer\":{\n" +
 | 
			
		||||
            "                       \"securityMode\":\"RPK\",\n" +
 | 
			
		||||
            "                       \"clientPublicKeyOrId\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUEBxNl/RcYJNm8mk91CyVXoIJiROYDlXcSSqK6e5bDHwOW4ZiN2lNnXalyF0Jxw8MbAytnDMERXyAja5VEMeVQ==\",\n" +
 | 
			
		||||
            "                       \"clientSecretKey\":\"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgd9GAx7yZW37autew5KZykn4IgRpge/tZSjnudnZJnMahRANCAARQQHE2X9Fxgk2byaT3ULJVeggmJE5gOVdxJKorp7lsMfA5bhmI3aU2ddqXIXQnHDwxsDK2cMwRFfICNrlUQx5V\"\n" +
 | 
			
		||||
            "                   }\n" +
 | 
			
		||||
            "               }\n" +
 | 
			
		||||
            "           }\n" +
 | 
			
		||||
            "   }\n" +
 | 
			
		||||
            "}";
 | 
			
		||||
 | 
			
		||||
    protected static final String FILTER_VALUE_TYPE = NEW_LINE + "## Value Type and Operations" + NEW_LINE +
 | 
			
		||||
            "Provides a hint about the data type of the entity field that is defined in the filter key. " +
 | 
			
		||||
            "The value type impacts the list of possible operations that you may use in the corresponding predicate. For example, you may use 'STARTS_WITH' or 'END_WITH', but you can't use 'GREATER_OR_EQUAL' for string values." +
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,8 @@
 | 
			
		||||
package org.thingsboard.server.controller;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import io.swagger.annotations.ApiParam;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.security.access.prepost.PreAuthorize;
 | 
			
		||||
import org.springframework.web.bind.annotation.PathVariable;
 | 
			
		||||
@ -35,16 +37,28 @@ import org.thingsboard.server.service.security.permission.Resource;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static org.thingsboard.server.controller.ControllerConstants.DEVICE_WITH_DEVICE_CREDENTIALS_PARAM_DESCRIPTION;
 | 
			
		||||
import static org.thingsboard.server.controller.ControllerConstants.IS_BOOTSTRAP_SERVER_PARAM_DESCRIPTION;
 | 
			
		||||
import static org.thingsboard.server.controller.ControllerConstants.TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@RestController
 | 
			
		||||
@TbCoreComponent
 | 
			
		||||
@RequestMapping("/api")
 | 
			
		||||
public class Lwm2mController extends BaseController {
 | 
			
		||||
    public static final String IS_BOOTSTRAP_SERVER = "isBootstrapServer";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "Get Lwm2m Bootstrap SecurityInfo (getLwm2mBootstrapSecurityInfo)",
 | 
			
		||||
            notes = "Get the Lwm2m Bootstrap SecurityInfo object (of the current server) based on the provided isBootstrapServer parameter. If isBootstrapServer == true, get the parameters of the current Bootstrap Server. If isBootstrapServer == false, get the parameters of the current Lwm2m Server. Used for client settings when starting the client in Bootstrap mode. " +
 | 
			
		||||
                    TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
 | 
			
		||||
            produces = "application/json")
 | 
			
		||||
    @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
 | 
			
		||||
    @RequestMapping(value = "/lwm2m/deviceProfile/bootstrap/{isBootstrapServer}", method = RequestMethod.GET)
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    public ServerSecurityConfig getLwm2mBootstrapSecurityInfo(@PathVariable("isBootstrapServer") boolean bootstrapServer) throws ThingsboardException {
 | 
			
		||||
    public ServerSecurityConfig getLwm2mBootstrapSecurityInfo(
 | 
			
		||||
            @ApiParam(value = IS_BOOTSTRAP_SERVER_PARAM_DESCRIPTION)
 | 
			
		||||
            @PathVariable(IS_BOOTSTRAP_SERVER) boolean bootstrapServer) throws ThingsboardException {
 | 
			
		||||
        try {
 | 
			
		||||
            return lwM2MServerSecurityInfoRepository.getServerSecurityInfo(bootstrapServer);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
@ -52,10 +66,23 @@ public class Lwm2mController extends BaseController {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "Create Device (saveDevice) with credentials ",
 | 
			
		||||
            notes = "\nCreate new Device  with credentials (example with security mode: RPK\n" +
 | 
			
		||||
                    "\nRequestBody is the Map<Class<?>, Object>:\n" +
 | 
			
		||||
                    "\nThe first param of this map: Device\n"+
 | 
			
		||||
                    "\n-- key1 = \"class org.thingsboard.server.common.data.Device\" - value1 = \"new Device()\"\n" +
 | 
			
		||||
                    "\nThe second param of this map: Device credentials\n" +
 | 
			
		||||
                    "\n-- key2 = \"class org.thingsboard.server.common.data.security.DeviceCredentials\" - value2 = \"new DeviceCredentials()\"\n" +
 | 
			
		||||
                    "\n- Example of the RequestBody with security mode: RPK:\n" +
 | 
			
		||||
                    "\n- " + DEVICE_WITH_DEVICE_CREDENTIALS_PARAM_DESCRIPTION + "\n" +
 | 
			
		||||
                    "\nWhen creating new device, platform generates Device Id as [time-based UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address).\n" +
 | 
			
		||||
                    "\nAfter creating new device Device DeviceCredentials is added to new Device."
 | 
			
		||||
                    + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
 | 
			
		||||
    @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
 | 
			
		||||
    @RequestMapping(value = "/lwm2m/device-credentials", method = RequestMethod.POST)
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    public Device saveDeviceWithCredentials(@RequestBody (required=false) Map<Class<?>, Object> deviceWithDeviceCredentials) throws ThingsboardException {
 | 
			
		||||
    public Device saveDeviceWithCredentials(@ApiParam(value = DEVICE_WITH_DEVICE_CREDENTIALS_PARAM_DESCRIPTION)
 | 
			
		||||
                                            @RequestBody(required = false) Map<Class<?>, Object> deviceWithDeviceCredentials) throws ThingsboardException {
 | 
			
		||||
        ObjectMapper mapper = new ObjectMapper();
 | 
			
		||||
        Device device = checkNotNull(mapper.convertValue(deviceWithDeviceCredentials.get(Device.class), Device.class));
 | 
			
		||||
        DeviceCredentials credentials = checkNotNull(mapper.convertValue(deviceWithDeviceCredentials.get(DeviceCredentials.class), DeviceCredentials.class));
 | 
			
		||||
 | 
			
		||||
@ -15,17 +15,30 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.common.data.lwm2m;
 | 
			
		||||
 | 
			
		||||
import io.swagger.annotations.ApiModel;
 | 
			
		||||
import io.swagger.annotations.ApiModelProperty;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
@ApiModel
 | 
			
		||||
@Data
 | 
			
		||||
public class ServerSecurityConfig {
 | 
			
		||||
    String host;
 | 
			
		||||
    String securityHost;
 | 
			
		||||
    Integer port;
 | 
			
		||||
    Integer securityPort;
 | 
			
		||||
    String serverPublicKey;
 | 
			
		||||
    @ApiModelProperty(position = 1, value = "Is Bootstrap Server.", example = "true", readOnly = true)
 | 
			
		||||
    boolean bootstrapServerIs = true;
 | 
			
		||||
    Integer clientHoldOffTime = 1;
 | 
			
		||||
    @ApiModelProperty(position = 2, value = "Host No Security.", example = "0.0.0.0", readOnly = true)
 | 
			
		||||
    String host;
 | 
			
		||||
    @ApiModelProperty(position = 3, value = "Port No Security.", example = "5687", readOnly = true)
 | 
			
		||||
    Integer port;
 | 
			
		||||
    @ApiModelProperty(position = 4, value = "Host Security.", example = "0.0.0.0", readOnly = true)
 | 
			
		||||
    String securityHost;
 | 
			
		||||
    @ApiModelProperty(position = 5, value = "Port Security.", example = "5688", readOnly = true)
 | 
			
		||||
    Integer securityPort;
 | 
			
		||||
    @ApiModelProperty(position = 5, value = "Server short Id.", example = "111", readOnly = true)
 | 
			
		||||
    Integer serverId = 111;
 | 
			
		||||
    @ApiModelProperty(position = 7, value = "Client Hold Off Time.", example = "1", readOnly = true)
 | 
			
		||||
    Integer clientHoldOffTime = 1;
 | 
			
		||||
    @ApiModelProperty(position = 8, value = "Server Public Key (formar base64).", example = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAZ0pSaGKHk/GrDaUDnQZpeEdGwX7m3Ws+U/kiVat\n" +
 | 
			
		||||
            "+44sgk3c8g0LotfMpLlZJPhPwJ6ipXV+O1r7IZUjBs3LNA==", readOnly = true)
 | 
			
		||||
    String serverPublicKey;
 | 
			
		||||
    @ApiModelProperty(position = 9, value = "Bootstrap Server Account Timeout.", example = "0", readOnly = true)
 | 
			
		||||
    Integer bootstrapServerAccountTimeout = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1134,7 +1134,6 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
 | 
			
		||||
            Map<Class<?>, Object> deviceCredentials = new ConcurrentHashMap<>();
 | 
			
		||||
            deviceCredentials.put(Device.class, device);
 | 
			
		||||
            deviceCredentials.put(DeviceCredentials.class, credentials);
 | 
			
		||||
//            return restTemplate.postForEntity(baseURL + "/api/lwm2m/device-credentials", deviceCredentials, Device.class).getBody();
 | 
			
		||||
            ResponseEntity<Device> deviceOpt = restTemplate.postForEntity(baseURL + "/api/lwm2m/device-credentials", deviceCredentials, Device.class);
 | 
			
		||||
            return Optional.ofNullable(deviceOpt.getBody());
 | 
			
		||||
        } catch (HttpClientErrorException exception) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user