Entity Relations Draft
This commit is contained in:
commit
90f7ff57d5
@ -196,13 +196,15 @@ public abstract class BaseController {
|
|||||||
protected final String DEVICE_INFO_DESCRIPTION = "Device Info is an extension of the default Device object that contains information about the assigned customer name and device profile name. ";
|
protected final String DEVICE_INFO_DESCRIPTION = "Device Info is an extension of the default Device object that contains information about the assigned customer name and device profile name. ";
|
||||||
protected final String ASSET_INFO_DESCRIPTION = "Asset Info is an extension of the default Asset object that contains information about the assigned customer name. ";
|
protected final String ASSET_INFO_DESCRIPTION = "Asset Info is an extension of the default Asset object that contains information about the assigned customer name. ";
|
||||||
protected final String ALARM_INFO_DESCRIPTION = "Alarm Info is an extension of the default Alarm object that also contains name of the alarm originator.";
|
protected final String ALARM_INFO_DESCRIPTION = "Alarm Info is an extension of the default Alarm object that also contains name of the alarm originator.";
|
||||||
|
protected final String RELATION_INFO_DESCRIPTION = "Relation Info is an extension of the default Relation object that contains information about the 'from' and 'to' entity names. ";
|
||||||
|
|
||||||
protected final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name.";
|
protected final String DEVICE_NAME_DESCRIPTION = "A string value representing the Device name.";
|
||||||
protected final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name.";
|
protected final String ASSET_NAME_DESCRIPTION = "A string value representing the Asset name.";
|
||||||
|
|
||||||
protected final String EVENT_START_TIME_DESCRIPTION = "Timestamp. Events with creation time before it won't be queried.";
|
protected final String EVENT_START_TIME_DESCRIPTION = "Timestamp. Events with creation time before it won't be queried.";
|
||||||
protected final String EVENT_END_TIME_DESCRIPTION = "Timestamp. Events with creation time after it won't be queried.";
|
protected final String EVENT_END_TIME_DESCRIPTION = "Timestamp. Events with creation time after it won't be queried.";
|
||||||
|
protected static final String RELATION_TYPE_PARAM_DESCRIPTION = "A string value representing relation type between entities. For example, 'Contains', 'Manages'. It can be any string value.";
|
||||||
|
protected static final String RELATION_TYPE_GROUP_PARAM_DESCRIPTION = "A string value representing relation type group. For example, 'COMMON'";
|
||||||
|
|
||||||
public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
|
public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
|
||||||
protected static final String DEFAULT_DASHBOARD = "defaultDashboardId";
|
protected static final String DEFAULT_DASHBOARD = "defaultDashboardId";
|
||||||
|
|||||||
@ -15,7 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.controller;
|
package org.thingsboard.server.controller;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import io.swagger.annotations.ApiParam;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@ -52,10 +55,26 @@ public class EntityRelationController extends BaseController {
|
|||||||
public static final String RELATION_TYPE = "relationType";
|
public static final String RELATION_TYPE = "relationType";
|
||||||
public static final String TO_ID = "toId";
|
public static final String TO_ID = "toId";
|
||||||
|
|
||||||
|
private static final String SECURITY_CHECKS_ENTITIES_DESCRIPTION = "\n\nIf the user has the authority of 'System Administrator', the server checks that 'from' and 'to' entities are owned by the sysadmin. " +
|
||||||
|
"If the user has the authority of 'Tenant Administrator', the server checks that 'from' and 'to' entities are owned by the same tenant. " +
|
||||||
|
"If the user has the authority of 'Customer User', the server checks that the 'from' and 'to' entities are assigned to the same customer.";
|
||||||
|
|
||||||
|
private static final String SECURITY_CHECKS_ENTITY_DESCRIPTION = "\n\nIf the user has the authority of 'System Administrator', the server checks that 'from' and 'to' entities are owned by the sysadmin. " +
|
||||||
|
"If the user has the authority of 'Tenant Administrator', the server checks that the entity is owned by the same tenant. " +
|
||||||
|
"If the user has the authority of 'Customer User', the server checks that the entity is assigned to the same customer.";
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperation(value = "Create Relation (saveRelation)",
|
||||||
|
notes = "Creates or updates a relation between two entities in the platform. " +
|
||||||
|
"Relations unique key is a combination of from/to entity id and relation type group and relation type. " +
|
||||||
|
"\n\nIf the user has the authority of 'System Administrator', the server checks that 'from' and 'to' entities are owned by the sysadmin. " +
|
||||||
|
"If the user has the authority of 'Tenant Administrator', the server checks that 'from' and 'to' entities are owned by the same tenant. " +
|
||||||
|
"If the user has the authority of 'Customer User', the server checks that the 'from' and 'to' entities are assigned to the same customer.")
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relation", method = RequestMethod.POST)
|
@RequestMapping(value = "/relation", method = RequestMethod.POST)
|
||||||
@ResponseStatus(value = HttpStatus.OK)
|
@ResponseStatus(value = HttpStatus.OK)
|
||||||
public void saveRelation(@RequestBody EntityRelation relation) throws ThingsboardException {
|
public void saveRelation(@ApiParam(value = "A JSON value representing the relation.", required = true)
|
||||||
|
@RequestBody EntityRelation relation) throws ThingsboardException {
|
||||||
try {
|
try {
|
||||||
checkNotNull(relation);
|
checkNotNull(relation);
|
||||||
checkEntityId(relation.getFrom(), Operation.WRITE);
|
checkEntityId(relation.getFrom(), Operation.WRITE);
|
||||||
@ -80,14 +99,17 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Delete Relation (deleteRelation)",
|
||||||
|
notes = "Deletes a relation between two entities in the platform. " + SECURITY_CHECKS_ENTITIES_DESCRIPTION)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relation", method = RequestMethod.DELETE, params = {FROM_ID, FROM_TYPE, RELATION_TYPE, TO_ID, TO_TYPE})
|
@RequestMapping(value = "/relation", method = RequestMethod.DELETE, params = {FROM_ID, FROM_TYPE, RELATION_TYPE, TO_ID, TO_TYPE})
|
||||||
@ResponseStatus(value = HttpStatus.OK)
|
@ResponseStatus(value = HttpStatus.OK)
|
||||||
public void deleteRelation(@RequestParam(FROM_ID) String strFromId,
|
public void deleteRelation(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(FROM_ID) String strFromId,
|
||||||
@RequestParam(FROM_TYPE) String strFromType,
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(FROM_TYPE) String strFromType,
|
||||||
@RequestParam(RELATION_TYPE) String strRelationType,
|
@ApiParam(value = RELATION_TYPE_PARAM_DESCRIPTION, required = true) @RequestParam(RELATION_TYPE) String strRelationType,
|
||||||
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup,
|
@ApiParam(value = RELATION_TYPE_GROUP_PARAM_DESCRIPTION) @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup,
|
||||||
@RequestParam(TO_ID) String strToId, @RequestParam(TO_TYPE) String strToType) throws ThingsboardException {
|
@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(TO_ID) String strToId,
|
||||||
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(TO_TYPE) String strToType) throws ThingsboardException {
|
||||||
checkParameter(FROM_ID, strFromId);
|
checkParameter(FROM_ID, strFromId);
|
||||||
checkParameter(FROM_TYPE, strFromType);
|
checkParameter(FROM_TYPE, strFromType);
|
||||||
checkParameter(RELATION_TYPE, strRelationType);
|
checkParameter(RELATION_TYPE, strRelationType);
|
||||||
@ -119,11 +141,14 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Delete Relations (deleteRelations)",
|
||||||
|
notes = "Deletes all the relation (both 'from' and 'to' direction) for the specified entity. " +
|
||||||
|
SECURITY_CHECKS_ENTITY_DESCRIPTION)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN','TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN','TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations", method = RequestMethod.DELETE, params = {"id", "type"})
|
@RequestMapping(value = "/relations", method = RequestMethod.DELETE, params = {"entityId", "entityType"})
|
||||||
@ResponseStatus(value = HttpStatus.OK)
|
@ResponseStatus(value = HttpStatus.OK)
|
||||||
public void deleteRelations(@RequestParam("entityId") String strId,
|
public void deleteRelations(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam("entityId") String strId,
|
||||||
@RequestParam("entityType") String strType) throws ThingsboardException {
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam("entityType") String strType) throws ThingsboardException {
|
||||||
checkParameter("entityId", strId);
|
checkParameter("entityId", strId);
|
||||||
checkParameter("entityType", strType);
|
checkParameter("entityType", strType);
|
||||||
EntityId entityId = EntityIdFactory.getByTypeAndId(strType, strId);
|
EntityId entityId = EntityIdFactory.getByTypeAndId(strType, strId);
|
||||||
@ -137,14 +162,18 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Get Relation (getRelation)",
|
||||||
|
notes = "Returns relation object between two specified entities if present. Otherwise throws exception." + SECURITY_CHECKS_ENTITIES_DESCRIPTION,
|
||||||
|
produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relation", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE, RELATION_TYPE, TO_ID, TO_TYPE})
|
@RequestMapping(value = "/relation", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE, RELATION_TYPE, TO_ID, TO_TYPE})
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public EntityRelation getRelation(@RequestParam(FROM_ID) String strFromId,
|
public EntityRelation getRelation(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(FROM_ID) String strFromId,
|
||||||
@RequestParam(FROM_TYPE) String strFromType,
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(FROM_TYPE) String strFromType,
|
||||||
@RequestParam(RELATION_TYPE) String strRelationType,
|
@ApiParam(value = RELATION_TYPE_PARAM_DESCRIPTION, required = true) @RequestParam(RELATION_TYPE) String strRelationType,
|
||||||
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup,
|
@ApiParam(value = RELATION_TYPE_GROUP_PARAM_DESCRIPTION) @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup,
|
||||||
@RequestParam(TO_ID) String strToId, @RequestParam(TO_TYPE) String strToType) throws ThingsboardException {
|
@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(TO_ID) String strToId,
|
||||||
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(TO_TYPE) String strToType) throws ThingsboardException {
|
||||||
try {
|
try {
|
||||||
checkParameter(FROM_ID, strFromId);
|
checkParameter(FROM_ID, strFromId);
|
||||||
checkParameter(FROM_TYPE, strFromType);
|
checkParameter(FROM_TYPE, strFromType);
|
||||||
@ -162,11 +191,16 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Get List of Relations (findByFrom)",
|
||||||
|
notes = "Returns list of relation objects for the specified entity by the 'from' direction. " +
|
||||||
|
SECURITY_CHECKS_ENTITY_DESCRIPTION,
|
||||||
|
produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE})
|
@RequestMapping(value = "/relations", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE})
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public List<EntityRelation> findByFrom(@RequestParam(FROM_ID) String strFromId,
|
public List<EntityRelation> findByFrom(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(FROM_ID) String strFromId,
|
||||||
@RequestParam(FROM_TYPE) String strFromType,
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(FROM_TYPE) String strFromType,
|
||||||
|
@ApiParam(value = RELATION_TYPE_GROUP_PARAM_DESCRIPTION)
|
||||||
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
||||||
checkParameter(FROM_ID, strFromId);
|
checkParameter(FROM_ID, strFromId);
|
||||||
checkParameter(FROM_TYPE, strFromType);
|
checkParameter(FROM_TYPE, strFromType);
|
||||||
@ -180,11 +214,16 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Get List of Relation Infos (findInfoByFrom)",
|
||||||
|
notes = "Returns list of relation info objects for the specified entity by the 'from' direction. " +
|
||||||
|
SECURITY_CHECKS_ENTITY_DESCRIPTION +" " + RELATION_INFO_DESCRIPTION,
|
||||||
|
produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations/info", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE})
|
@RequestMapping(value = "/relations/info", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE})
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public List<EntityRelationInfo> findInfoByFrom(@RequestParam(FROM_ID) String strFromId,
|
public List<EntityRelationInfo> findInfoByFrom(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(FROM_ID) String strFromId,
|
||||||
@RequestParam(FROM_TYPE) String strFromType,
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(FROM_TYPE) String strFromType,
|
||||||
|
@ApiParam(value = RELATION_TYPE_GROUP_PARAM_DESCRIPTION)
|
||||||
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
||||||
checkParameter(FROM_ID, strFromId);
|
checkParameter(FROM_ID, strFromId);
|
||||||
checkParameter(FROM_TYPE, strFromType);
|
checkParameter(FROM_TYPE, strFromType);
|
||||||
@ -198,12 +237,17 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Get List of Relations (findByFrom)",
|
||||||
|
notes = "Returns list of relation objects for the specified entity by the 'from' direction and relation type. " +
|
||||||
|
SECURITY_CHECKS_ENTITY_DESCRIPTION,
|
||||||
|
produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE, RELATION_TYPE})
|
@RequestMapping(value = "/relations", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE, RELATION_TYPE})
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public List<EntityRelation> findByFrom(@RequestParam(FROM_ID) String strFromId,
|
public List<EntityRelation> findByFrom(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(FROM_ID) String strFromId,
|
||||||
@RequestParam(FROM_TYPE) String strFromType,
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(FROM_TYPE) String strFromType,
|
||||||
@RequestParam(RELATION_TYPE) String strRelationType,
|
@ApiParam(value = RELATION_TYPE_PARAM_DESCRIPTION, required = true) @RequestParam(RELATION_TYPE) String strRelationType,
|
||||||
|
@ApiParam(value = RELATION_TYPE_GROUP_PARAM_DESCRIPTION)
|
||||||
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
||||||
checkParameter(FROM_ID, strFromId);
|
checkParameter(FROM_ID, strFromId);
|
||||||
checkParameter(FROM_TYPE, strFromType);
|
checkParameter(FROM_TYPE, strFromType);
|
||||||
@ -218,11 +262,16 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Get List of Relations (findByTo)",
|
||||||
|
notes = "Returns list of relation objects for the specified entity by the 'to' direction. " +
|
||||||
|
SECURITY_CHECKS_ENTITY_DESCRIPTION,
|
||||||
|
produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations", method = RequestMethod.GET, params = {TO_ID, TO_TYPE})
|
@RequestMapping(value = "/relations", method = RequestMethod.GET, params = {TO_ID, TO_TYPE})
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public List<EntityRelation> findByTo(@RequestParam(TO_ID) String strToId,
|
public List<EntityRelation> findByTo(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(TO_ID) String strToId,
|
||||||
@RequestParam(TO_TYPE) String strToType,
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(TO_TYPE) String strToType,
|
||||||
|
@ApiParam(value = RELATION_TYPE_GROUP_PARAM_DESCRIPTION)
|
||||||
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
||||||
checkParameter(TO_ID, strToId);
|
checkParameter(TO_ID, strToId);
|
||||||
checkParameter(TO_TYPE, strToType);
|
checkParameter(TO_TYPE, strToType);
|
||||||
@ -236,11 +285,16 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Get List of Relation Infos (findInfoByTo)",
|
||||||
|
notes = "Returns list of relation info objects for the specified entity by the 'to' direction. " +
|
||||||
|
SECURITY_CHECKS_ENTITY_DESCRIPTION + " " + RELATION_INFO_DESCRIPTION,
|
||||||
|
produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations/info", method = RequestMethod.GET, params = {TO_ID, TO_TYPE})
|
@RequestMapping(value = "/relations/info", method = RequestMethod.GET, params = {TO_ID, TO_TYPE})
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public List<EntityRelationInfo> findInfoByTo(@RequestParam(TO_ID) String strToId,
|
public List<EntityRelationInfo> findInfoByTo(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(TO_ID) String strToId,
|
||||||
@RequestParam(TO_TYPE) String strToType,
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(TO_TYPE) String strToType,
|
||||||
|
@ApiParam(value = RELATION_TYPE_GROUP_PARAM_DESCRIPTION)
|
||||||
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
||||||
checkParameter(TO_ID, strToId);
|
checkParameter(TO_ID, strToId);
|
||||||
checkParameter(TO_TYPE, strToType);
|
checkParameter(TO_TYPE, strToType);
|
||||||
@ -254,12 +308,17 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Get List of Relations (findByTo)",
|
||||||
|
notes = "Returns list of relation objects for the specified entity by the 'to' direction and relation type. " +
|
||||||
|
SECURITY_CHECKS_ENTITY_DESCRIPTION,
|
||||||
|
produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations", method = RequestMethod.GET, params = {TO_ID, TO_TYPE, RELATION_TYPE})
|
@RequestMapping(value = "/relations", method = RequestMethod.GET, params = {TO_ID, TO_TYPE, RELATION_TYPE})
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public List<EntityRelation> findByTo(@RequestParam(TO_ID) String strToId,
|
public List<EntityRelation> findByTo(@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @RequestParam(TO_ID) String strToId,
|
||||||
@RequestParam(TO_TYPE) String strToType,
|
@ApiParam(value = ENTITY_TYPE_DESCRIPTION, required = true) @RequestParam(TO_TYPE) String strToType,
|
||||||
@RequestParam(RELATION_TYPE) String strRelationType,
|
@ApiParam(value = RELATION_TYPE_PARAM_DESCRIPTION, required = true) @RequestParam(RELATION_TYPE) String strRelationType,
|
||||||
|
@ApiParam(value = RELATION_TYPE_GROUP_PARAM_DESCRIPTION)
|
||||||
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
@RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException {
|
||||||
checkParameter(TO_ID, strToId);
|
checkParameter(TO_ID, strToId);
|
||||||
checkParameter(TO_TYPE, strToType);
|
checkParameter(TO_TYPE, strToType);
|
||||||
@ -274,10 +333,15 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Find related entities (findByQuery)",
|
||||||
|
notes = "Returns all entities that are related to the specific entity. " +
|
||||||
|
"The entity id, relation type, entity types, depth of the search, and other query parameters defined using complex 'EntityRelationsQuery' object. " +
|
||||||
|
"See 'Model' tab of the Parameters for more info.", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations", method = RequestMethod.POST)
|
@RequestMapping(value = "/relations", method = RequestMethod.POST)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public List<EntityRelation> findByQuery(@RequestBody EntityRelationsQuery query) throws ThingsboardException {
|
public List<EntityRelation> findByQuery(@ApiParam(value = "A JSON value representing the entity relations query object.", required = true)
|
||||||
|
@RequestBody EntityRelationsQuery query) throws ThingsboardException {
|
||||||
checkNotNull(query);
|
checkNotNull(query);
|
||||||
checkNotNull(query.getParameters());
|
checkNotNull(query.getParameters());
|
||||||
checkNotNull(query.getFilters());
|
checkNotNull(query.getFilters());
|
||||||
@ -289,10 +353,15 @@ public class EntityRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "Find related entity infos (findInfoByQuery)",
|
||||||
|
notes = "Returns all entity infos that are related to the specific entity. " +
|
||||||
|
"The entity id, relation type, entity types, depth of the search, and other query parameters defined using complex 'EntityRelationsQuery' object. " +
|
||||||
|
"See 'Model' tab of the Parameters for more info. " + RELATION_INFO_DESCRIPTION, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/relations/info", method = RequestMethod.POST)
|
@RequestMapping(value = "/relations/info", method = RequestMethod.POST)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public List<EntityRelationInfo> findInfoByQuery(@RequestBody EntityRelationsQuery query) throws ThingsboardException {
|
public List<EntityRelationInfo> findInfoByQuery(@ApiParam(value = "A JSON value representing the entity relations query object.", required = true)
|
||||||
|
@RequestBody EntityRelationsQuery query) throws ThingsboardException {
|
||||||
checkNotNull(query);
|
checkNotNull(query);
|
||||||
checkNotNull(query.getParameters());
|
checkNotNull(query.getParameters());
|
||||||
checkNotNull(query.getFilters());
|
checkNotNull(query.getFilters());
|
||||||
|
|||||||
@ -18,6 +18,8 @@ package org.thingsboard.server.common.data.id;
|
|||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
@ -29,12 +31,15 @@ import java.util.UUID;
|
|||||||
|
|
||||||
@JsonDeserialize(using = EntityIdDeserializer.class)
|
@JsonDeserialize(using = EntityIdDeserializer.class)
|
||||||
@JsonSerialize(using = EntityIdSerializer.class)
|
@JsonSerialize(using = EntityIdSerializer.class)
|
||||||
|
@ApiModel
|
||||||
public interface EntityId extends HasUUID, Serializable { //NOSONAR, the constant is closely related to EntityId
|
public interface EntityId extends HasUUID, Serializable { //NOSONAR, the constant is closely related to EntityId
|
||||||
|
|
||||||
UUID NULL_UUID = UUID.fromString("13814000-1dd2-11b2-8080-808080808080");
|
UUID NULL_UUID = UUID.fromString("13814000-1dd2-11b2-8080-808080808080");
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 1, required = true, value = "string", example = "784f394c-42b6-435a-983c-b7beff2784f9")
|
||||||
UUID getId();
|
UUID getId();
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 2, required = true, value = "string", example = "DEVICE")
|
||||||
EntityType getEntityType();
|
EntityType getEntityType();
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
|||||||
@ -16,18 +16,17 @@
|
|||||||
package org.thingsboard.server.common.data.relation;
|
package org.thingsboard.server.common.data.relation;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo;
|
import org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@ApiModel
|
||||||
public class EntityRelation implements Serializable {
|
public class EntityRelation implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2807343040519543363L;
|
private static final long serialVersionUID = 2807343040519543363L;
|
||||||
@ -72,6 +71,7 @@ public class EntityRelation implements Serializable {
|
|||||||
this.additionalInfo = entityRelation.getAdditionalInfo();
|
this.additionalInfo = entityRelation.getAdditionalInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 1, value = "JSON object with [from] Entity Id.", readOnly = true)
|
||||||
public EntityId getFrom() {
|
public EntityId getFrom() {
|
||||||
return from;
|
return from;
|
||||||
}
|
}
|
||||||
@ -80,6 +80,7 @@ public class EntityRelation implements Serializable {
|
|||||||
this.from = from;
|
this.from = from;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 2, value = "JSON object with [to] Entity Id.", readOnly = true)
|
||||||
public EntityId getTo() {
|
public EntityId getTo() {
|
||||||
return to;
|
return to;
|
||||||
}
|
}
|
||||||
@ -88,6 +89,7 @@ public class EntityRelation implements Serializable {
|
|||||||
this.to = to;
|
this.to = to;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 3, value = "String value of relation type.", example = "Contains")
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
@ -96,6 +98,7 @@ public class EntityRelation implements Serializable {
|
|||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 4, value = "Represents the type group of the relation.", example = "COMMON")
|
||||||
public RelationTypeGroup getTypeGroup() {
|
public RelationTypeGroup getTypeGroup() {
|
||||||
return typeGroup;
|
return typeGroup;
|
||||||
}
|
}
|
||||||
@ -104,6 +107,7 @@ public class EntityRelation implements Serializable {
|
|||||||
this.typeGroup = typeGroup;
|
this.typeGroup = typeGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 5, value = "Additional parameters of the relation", dataType = "com.fasterxml.jackson.databind.JsonNode")
|
||||||
public JsonNode getAdditionalInfo() {
|
public JsonNode getAdditionalInfo() {
|
||||||
return SearchTextBasedWithAdditionalInfo.getJson(() -> additionalInfo, () -> additionalInfoBytes);
|
return SearchTextBasedWithAdditionalInfo.getJson(() -> additionalInfo, () -> additionalInfoBytes);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.common.data.relation;
|
package org.thingsboard.server.common.data.relation;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
|
||||||
public class EntityRelationInfo extends EntityRelation {
|
public class EntityRelationInfo extends EntityRelation {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2807343097519543363L;
|
private static final long serialVersionUID = 2807343097519543363L;
|
||||||
@ -30,6 +32,7 @@ public class EntityRelationInfo extends EntityRelation {
|
|||||||
super(entityRelation);
|
super(entityRelation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 6, value = "Name of the entity for [from] direction.", readOnly = true, example = "A4B72CCDFF33")
|
||||||
public String getFromName() {
|
public String getFromName() {
|
||||||
return fromName;
|
return fromName;
|
||||||
}
|
}
|
||||||
@ -38,6 +41,7 @@ public class EntityRelationInfo extends EntityRelation {
|
|||||||
this.fromName = fromName;
|
this.fromName = fromName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 7, value = "Name of the entity for [to] direction.", readOnly = true, example = "A4B72CCDFF35")
|
||||||
public String getToName() {
|
public String getToName() {
|
||||||
return toName;
|
return toName;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.common.data.relation;
|
package org.thingsboard.server.common.data.relation;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -23,9 +25,12 @@ import java.util.List;
|
|||||||
* Created by ashvayka on 02.05.17.
|
* Created by ashvayka on 02.05.17.
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
|
@ApiModel
|
||||||
public class EntityRelationsQuery {
|
public class EntityRelationsQuery {
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 2, value = "Main search parameters.")
|
||||||
private RelationsSearchParameters parameters;
|
private RelationsSearchParameters parameters;
|
||||||
|
@ApiModelProperty(position = 1, value = "Main filters.")
|
||||||
private List<RelationEntityTypeFilter> filters;
|
private List<RelationEntityTypeFilter> filters;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.common.data.relation;
|
package org.thingsboard.server.common.data.relation;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
@ -26,9 +28,12 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
@ApiModel
|
||||||
public class RelationEntityTypeFilter {
|
public class RelationEntityTypeFilter {
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 1, value = "Type of the relation between root entity and other entity (e.g. 'Contains' or 'Manages').", example = "Contains")
|
||||||
private String relationType;
|
private String relationType;
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 2, value = "Array of entity types to filter the related entities (e.g. 'DEVICE', 'ASSET').")
|
||||||
private List<EntityType> entityTypes;
|
private List<EntityType> entityTypes;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.common.data.relation;
|
package org.thingsboard.server.common.data.relation;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -33,7 +34,7 @@ import java.util.UUID;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class RelationsSearchParameters {
|
public class RelationsSearchParameters {
|
||||||
|
|
||||||
@ApiModelProperty(position = 1, value = "Root entity id to start search from.")
|
@ApiModelProperty(position = 1, value = "Root entity id to start search from.", example = "784f394c-42b6-435a-983c-b7beff2784f9")
|
||||||
private UUID rootId;
|
private UUID rootId;
|
||||||
@ApiModelProperty(position = 2, value = "Type of the root entity.")
|
@ApiModelProperty(position = 2, value = "Type of the root entity.")
|
||||||
private EntityType rootType;
|
private EntityType rootType;
|
||||||
@ -59,6 +60,7 @@ public class RelationsSearchParameters {
|
|||||||
this.fetchLastLevelOnly = fetchLastLevelOnly;
|
this.fetchLastLevelOnly = fetchLastLevelOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
public EntityId getEntityId() {
|
public EntityId getEntityId() {
|
||||||
return EntityIdFactory.getByTypeAndUuid(rootType, rootId);
|
return EntityIdFactory.getByTypeAndUuid(rootType, rootId);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user