thingsboard-memoizeit

Merge pull request #104 from thingsboard/dao-refactoring-vs ModelConstants

4/15/2017 3:34:49 PM

Changes

Details

diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml
index 8766e57..c626725 100644
--- a/application/src/main/resources/thingsboard.yml
+++ b/application/src/main/resources/thingsboard.yml
@@ -95,6 +95,7 @@ coap:
 
 # Cassandra driver configuration parameters
 cassandra:
+  enabled: "${CASSANDRA_ENABLED:true}"
   # Thingsboard cluster name
   cluster_name: "${CASSANDRA_CLUSTER_NAME:Thingsboard Cluster}"
   # Thingsboard keyspace name
@@ -189,11 +190,7 @@ updates:
   # Enable/disable updates checking.
   enabled: "${UPDATES_ENABLED:true}"
 
-cassandra:
-  enabled: "${CASSANDRA_ENABLED:true}"
-
 # SQL DAO Configuration
-
 sql:
   enabled: "${SQL_ENABLED:false}"
   datasource:
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/ComponentDescriptorEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/ComponentDescriptorEntity.java
index d5cf08c..2ff09a7 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/ComponentDescriptorEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/ComponentDescriptorEntity.java
@@ -23,43 +23,44 @@ import org.thingsboard.server.common.data.id.ComponentDescriptorId;
 import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
 import org.thingsboard.server.common.data.plugin.ComponentScope;
 import org.thingsboard.server.common.data.plugin.ComponentType;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 import org.thingsboard.server.dao.model.type.JsonCodec;
 
 import java.util.UUID;
 
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
 /**
  * @author Andrew Shvayka
  */
-@Table(name = ModelConstants.COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME)
+@Table(name = COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME)
 public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDescriptor> {
 
     private static final long serialVersionUID = 1L;
 
     @PartitionKey
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
 
-    @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_TYPE_PROPERTY)
+    @Column(name = COMPONENT_DESCRIPTOR_TYPE_PROPERTY)
     private ComponentType type;
 
-    @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_SCOPE_PROPERTY)
+    @Column(name = COMPONENT_DESCRIPTOR_SCOPE_PROPERTY)
     private ComponentScope scope;
 
-    @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_NAME_PROPERTY)
+    @Column(name = COMPONENT_DESCRIPTOR_NAME_PROPERTY)
     private String name;
 
-    @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CLASS_PROPERTY)
+    @Column(name = COMPONENT_DESCRIPTOR_CLASS_PROPERTY)
     private String clazz;
 
-    @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CONFIGURATION_DESCRIPTOR_PROPERTY, codec = JsonCodec.class)
+    @Column(name = COMPONENT_DESCRIPTOR_CONFIGURATION_DESCRIPTOR_PROPERTY, codec = JsonCodec.class)
     private JsonNode configurationDescriptor;
 
-    @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_ACTIONS_PROPERTY)
+    @Column(name = COMPONENT_DESCRIPTOR_ACTIONS_PROPERTY)
     private String actions;
 
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
 
     public ComponentDescriptorEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/CustomerEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/CustomerEntity.java
index ce3dbff..5213499 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/CustomerEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/CustomerEntity.java
@@ -20,7 +20,6 @@ import java.util.UUID;
 import org.thingsboard.server.common.data.Customer;
 import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 import org.thingsboard.server.dao.model.type.JsonCodec;
 
@@ -31,51 +30,53 @@ import com.datastax.driver.mapping.annotations.Table;
 import com.datastax.driver.mapping.annotations.Transient;
 import com.fasterxml.jackson.databind.JsonNode;
 
-@Table(name = ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME)
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
+@Table(name = CUSTOMER_COLUMN_FAMILY_NAME)
 public final class CustomerEntity implements SearchTextEntity<Customer> {
 
     @Transient
     private static final long serialVersionUID = -7732527103760948490L;
     
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
     
     @PartitionKey(value = 1)
-    @Column(name = ModelConstants.CUSTOMER_TENANT_ID_PROPERTY)
+    @Column(name = CUSTOMER_TENANT_ID_PROPERTY)
     private UUID tenantId;
     
-    @Column(name = ModelConstants.CUSTOMER_TITLE_PROPERTY)
+    @Column(name = CUSTOMER_TITLE_PROPERTY)
     private String title;
     
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
     
-    @Column(name = ModelConstants.COUNTRY_PROPERTY)
+    @Column(name = COUNTRY_PROPERTY)
     private String country;
     
-    @Column(name = ModelConstants.STATE_PROPERTY)
+    @Column(name = STATE_PROPERTY)
     private String state;
 
-    @Column(name = ModelConstants.CITY_PROPERTY)
+    @Column(name = CITY_PROPERTY)
     private String city;
 
-    @Column(name = ModelConstants.ADDRESS_PROPERTY)
+    @Column(name = ADDRESS_PROPERTY)
     private String address;
 
-    @Column(name = ModelConstants.ADDRESS2_PROPERTY)
+    @Column(name = ADDRESS2_PROPERTY)
     private String address2;
 
-    @Column(name = ModelConstants.ZIP_PROPERTY)
+    @Column(name = ZIP_PROPERTY)
     private String zip;
 
-    @Column(name = ModelConstants.PHONE_PROPERTY)
+    @Column(name = PHONE_PROPERTY)
     private String phone;
 
-    @Column(name = ModelConstants.EMAIL_PROPERTY)
+    @Column(name = EMAIL_PROPERTY)
     private String email;
 
-    @Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
+    @Column(name = CUSTOMER_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
     private JsonNode additionalInfo;
 
     public CustomerEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardEntity.java
index 911e970..ef9df97 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardEntity.java
@@ -21,7 +21,6 @@ import org.thingsboard.server.common.data.Dashboard;
 import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.DashboardId;
 import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 import org.thingsboard.server.dao.model.type.JsonCodec;
 
@@ -32,31 +31,33 @@ import com.datastax.driver.mapping.annotations.Table;
 import com.datastax.driver.mapping.annotations.Transient;
 import com.fasterxml.jackson.databind.JsonNode;
 
-@Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
+@Table(name = DASHBOARD_COLUMN_FAMILY_NAME)
 public final class DashboardEntity implements SearchTextEntity<Dashboard> {
     
     @Transient
     private static final long serialVersionUID = 2998395951247446191L;
 
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
     
     @PartitionKey(value = 1)
-    @Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY)
+    @Column(name = DASHBOARD_TENANT_ID_PROPERTY)
     private UUID tenantId;
 
     @PartitionKey(value = 2)
-    @Column(name = ModelConstants.DASHBOARD_CUSTOMER_ID_PROPERTY)
+    @Column(name = DASHBOARD_CUSTOMER_ID_PROPERTY)
     private UUID customerId;
 
-    @Column(name = ModelConstants.DASHBOARD_TITLE_PROPERTY)
+    @Column(name = DASHBOARD_TITLE_PROPERTY)
     private String title;
     
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
     
-    @Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY, codec = JsonCodec.class)
+    @Column(name = DASHBOARD_CONFIGURATION_PROPERTY, codec = JsonCodec.class)
     private JsonNode configuration;
 
     public DashboardEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java
index 2c5fe00..4a31859 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DashboardInfoEntity.java
@@ -21,7 +21,6 @@ import org.thingsboard.server.common.data.DashboardInfo;
 import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.DashboardId;
 import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 
 import com.datastax.driver.core.utils.UUIDs;
@@ -30,28 +29,30 @@ import com.datastax.driver.mapping.annotations.PartitionKey;
 import com.datastax.driver.mapping.annotations.Table;
 import com.datastax.driver.mapping.annotations.Transient;
 
-@Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
+@Table(name = DASHBOARD_COLUMN_FAMILY_NAME)
 public class DashboardInfoEntity implements SearchTextEntity<DashboardInfo> {
 
     @Transient
     private static final long serialVersionUID = 2998395951247446191L;
 
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
 
     @PartitionKey(value = 1)
-    @Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY)
+    @Column(name = DASHBOARD_TENANT_ID_PROPERTY)
     private UUID tenantId;
 
     @PartitionKey(value = 2)
-    @Column(name = ModelConstants.DASHBOARD_CUSTOMER_ID_PROPERTY)
+    @Column(name = DASHBOARD_CUSTOMER_ID_PROPERTY)
     private UUID customerId;
 
-    @Column(name = ModelConstants.DASHBOARD_TITLE_PROPERTY)
+    @Column(name = DASHBOARD_TITLE_PROPERTY)
     private String title;
 
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
 
     public DashboardInfoEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceCredentialsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceCredentialsEntity.java
index 32864c6..3acfbad 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceCredentialsEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceCredentialsEntity.java
@@ -22,7 +22,6 @@ import org.thingsboard.server.common.data.id.DeviceId;
 import org.thingsboard.server.common.data.security.DeviceCredentials;
 import org.thingsboard.server.common.data.security.DeviceCredentialsType;
 import org.thingsboard.server.dao.model.BaseEntity;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.type.DeviceCredentialsTypeCodec;
 
 import com.datastax.driver.core.utils.UUIDs;
@@ -31,26 +30,28 @@ import com.datastax.driver.mapping.annotations.PartitionKey;
 import com.datastax.driver.mapping.annotations.Table;
 import com.datastax.driver.mapping.annotations.Transient;
 
-@Table(name = ModelConstants.DEVICE_CREDENTIALS_COLUMN_FAMILY_NAME)
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
+@Table(name = DEVICE_CREDENTIALS_COLUMN_FAMILY_NAME)
 public final class DeviceCredentialsEntity implements BaseEntity<DeviceCredentials> {
 
     @Transient
     private static final long serialVersionUID = -2667310560260623272L;
     
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
     
-    @Column(name = ModelConstants.DEVICE_CREDENTIALS_DEVICE_ID_PROPERTY)
+    @Column(name = DEVICE_CREDENTIALS_DEVICE_ID_PROPERTY)
     private UUID deviceId;
     
-    @Column(name = ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_TYPE_PROPERTY, codec = DeviceCredentialsTypeCodec.class)
+    @Column(name = DEVICE_CREDENTIALS_CREDENTIALS_TYPE_PROPERTY, codec = DeviceCredentialsTypeCodec.class)
     private DeviceCredentialsType credentialsType;
 
-    @Column(name = ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_ID_PROPERTY)
+    @Column(name = DEVICE_CREDENTIALS_CREDENTIALS_ID_PROPERTY)
     private String credentialsId;
 
-    @Column(name = ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_VALUE_PROPERTY)
+    @Column(name = DEVICE_CREDENTIALS_CREDENTIALS_VALUE_PROPERTY)
     private String credentialsValue;
 
     public DeviceCredentialsEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceEntity.java
index 70c9a36..8b21096 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/DeviceEntity.java
@@ -25,37 +25,38 @@ import org.thingsboard.server.common.data.Device;
 import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.DeviceId;
 import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 import org.thingsboard.server.dao.model.type.JsonCodec;
 
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
 import java.util.UUID;
 
-@Table(name = ModelConstants.DEVICE_COLUMN_FAMILY_NAME)
+@Table(name = DEVICE_COLUMN_FAMILY_NAME)
 public final class DeviceEntity implements SearchTextEntity<Device> {
 
     @Transient
     private static final long serialVersionUID = -1265181166886910152L;
     
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
     
     @PartitionKey(value = 1)
-    @Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY)
+    @Column(name = DEVICE_TENANT_ID_PROPERTY)
     private UUID tenantId;
 
     @PartitionKey(value = 2)
-    @Column(name = ModelConstants.DEVICE_CUSTOMER_ID_PROPERTY)
+    @Column(name = DEVICE_CUSTOMER_ID_PROPERTY)
     private UUID customerId;
 
-    @Column(name = ModelConstants.DEVICE_NAME_PROPERTY)
+    @Column(name = DEVICE_NAME_PROPERTY)
     private String name;
     
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
     
-    @Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
+    @Column(name = DEVICE_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
     private JsonNode additionalInfo;
 
     public DeviceEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/EventEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/EventEntity.java
index abfcfef..a2987b1 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/EventEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/EventEntity.java
@@ -24,10 +24,11 @@ import org.thingsboard.server.common.data.EntityType;
 import org.thingsboard.server.common.data.Event;
 import org.thingsboard.server.common.data.id.*;
 import org.thingsboard.server.dao.model.BaseEntity;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.type.EntityTypeCodec;
 import org.thingsboard.server.dao.model.type.JsonCodec;
 
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
 import java.util.UUID;
 
 /**
@@ -35,36 +36,36 @@ import java.util.UUID;
  */
 @Data
 @NoArgsConstructor
-@Table(name = ModelConstants.DEVICE_COLUMN_FAMILY_NAME)
+@Table(name = DEVICE_COLUMN_FAMILY_NAME)
 public class EventEntity implements BaseEntity<Event> {
 
     @Transient
     private static final long serialVersionUID = -1265181166886910153L;
 
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
 
     @PartitionKey()
-    @Column(name = ModelConstants.EVENT_TENANT_ID_PROPERTY)
+    @Column(name = EVENT_TENANT_ID_PROPERTY)
     private UUID tenantId;
 
     @PartitionKey(value = 1)
-    @Column(name = ModelConstants.EVENT_ENTITY_TYPE_PROPERTY, codec = EntityTypeCodec.class)
+    @Column(name = EVENT_ENTITY_TYPE_PROPERTY, codec = EntityTypeCodec.class)
     private EntityType entityType;
 
     @PartitionKey(value = 2)
-    @Column(name = ModelConstants.EVENT_ENTITY_ID_PROPERTY)
+    @Column(name = EVENT_ENTITY_ID_PROPERTY)
     private UUID entityId;
 
     @ClusteringColumn()
-    @Column(name = ModelConstants.EVENT_TYPE_PROPERTY)
+    @Column(name = EVENT_TYPE_PROPERTY)
     private String eventType;
 
     @ClusteringColumn(value = 1)
-    @Column(name = ModelConstants.EVENT_UID_PROPERTY)
+    @Column(name = EVENT_UID_PROPERTY)
     private String eventUId;
 
-    @Column(name = ModelConstants.EVENT_BODY_PROPERTY, codec = JsonCodec.class)
+    @Column(name = EVENT_BODY_PROPERTY, codec = JsonCodec.class)
     private JsonNode body;
 
     public EventEntity(Event event) {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/PluginMetaDataEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/PluginMetaDataEntity.java
index caddacb..4a0dca2 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/PluginMetaDataEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/PluginMetaDataEntity.java
@@ -22,50 +22,51 @@ import org.thingsboard.server.common.data.id.PluginId;
 import org.thingsboard.server.common.data.id.TenantId;
 import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
 import org.thingsboard.server.common.data.plugin.PluginMetaData;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 import org.thingsboard.server.dao.model.type.ComponentLifecycleStateCodec;
 import org.thingsboard.server.dao.model.type.JsonCodec;
 
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
 import java.util.Objects;
 import java.util.UUID;
 
-@Table(name = ModelConstants.PLUGIN_COLUMN_FAMILY_NAME)
+@Table(name = PLUGIN_COLUMN_FAMILY_NAME)
 public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
 
     @Transient
     private static final long serialVersionUID = -5231612734979707866L;
 
     @PartitionKey
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
 
-    @Column(name = ModelConstants.PLUGIN_API_TOKEN_PROPERTY)
+    @Column(name = PLUGIN_API_TOKEN_PROPERTY)
     private String apiToken;
 
     @ClusteringColumn
-    @Column(name = ModelConstants.PLUGIN_TENANT_ID_PROPERTY)
+    @Column(name = PLUGIN_TENANT_ID_PROPERTY)
     private UUID tenantId;
 
-    @Column(name = ModelConstants.PLUGIN_NAME_PROPERTY)
+    @Column(name = PLUGIN_NAME_PROPERTY)
     private String name;
 
-    @Column(name = ModelConstants.PLUGIN_CLASS_PROPERTY)
+    @Column(name = PLUGIN_CLASS_PROPERTY)
     private String clazz;
 
-    @Column(name = ModelConstants.PLUGIN_ACCESS_PROPERTY)
+    @Column(name = PLUGIN_ACCESS_PROPERTY)
     private boolean publicAccess;
 
-    @Column(name = ModelConstants.PLUGIN_STATE_PROPERTY, codec = ComponentLifecycleStateCodec.class)
+    @Column(name = PLUGIN_STATE_PROPERTY, codec = ComponentLifecycleStateCodec.class)
     private ComponentLifecycleState state;
 
-    @Column(name = ModelConstants.PLUGIN_CONFIGURATION_PROPERTY, codec = JsonCodec.class)
+    @Column(name = PLUGIN_CONFIGURATION_PROPERTY, codec = JsonCodec.class)
     private JsonNode configuration;
 
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
 
-    @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
+    @Column(name = ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
     private JsonNode additionalInfo;
 
     public PluginMetaDataEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/RuleMetaDataEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/RuleMetaDataEntity.java
index 29d32fd..dea7661 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/RuleMetaDataEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/RuleMetaDataEntity.java
@@ -26,43 +26,44 @@ import org.thingsboard.server.common.data.id.TenantId;
 import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
 import org.thingsboard.server.common.data.rule.RuleMetaData;
 import org.thingsboard.server.dao.DaoUtil;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 import org.thingsboard.server.dao.model.type.ComponentLifecycleStateCodec;
 import org.thingsboard.server.dao.model.type.JsonCodec;
 
+import static org.thingsboard.server.dao.model.ModelConstants.*;
+
 import javax.persistence.Transient;
 import java.util.Objects;
 import java.util.UUID;
 
-@Table(name = ModelConstants.RULE_COLUMN_FAMILY_NAME)
+@Table(name = RULE_COLUMN_FAMILY_NAME)
 public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
 
     @Transient
     private static final long serialVersionUID = 4011728715100800304L;
     @PartitionKey
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
     @ClusteringColumn
-    @Column(name = ModelConstants.RULE_TENANT_ID_PROPERTY)
+    @Column(name = RULE_TENANT_ID_PROPERTY)
     private UUID tenantId;
-    @Column(name = ModelConstants.RULE_NAME_PROPERTY)
+    @Column(name = RULE_NAME_PROPERTY)
     private String name;
-    @Column(name = ModelConstants.RULE_STATE_PROPERTY, codec = ComponentLifecycleStateCodec.class)
+    @Column(name = RULE_STATE_PROPERTY, codec = ComponentLifecycleStateCodec.class)
     private ComponentLifecycleState state;
-    @Column(name = ModelConstants.RULE_WEIGHT_PROPERTY)
+    @Column(name = RULE_WEIGHT_PROPERTY)
     private int weight;
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
-    @Column(name = ModelConstants.RULE_PLUGIN_TOKEN_PROPERTY)
+    @Column(name = RULE_PLUGIN_TOKEN_PROPERTY)
     private String pluginToken;
-    @Column(name = ModelConstants.RULE_FILTERS, codec = JsonCodec.class)
+    @Column(name = RULE_FILTERS, codec = JsonCodec.class)
     private JsonNode filters;
-    @Column(name = ModelConstants.RULE_PROCESSOR, codec = JsonCodec.class)
+    @Column(name = RULE_PROCESSOR, codec = JsonCodec.class)
     private JsonNode processor;
-    @Column(name = ModelConstants.RULE_ACTION, codec = JsonCodec.class)
+    @Column(name = RULE_ACTION, codec = JsonCodec.class)
     private JsonNode action;
-    @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
+    @Column(name = ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
     private JsonNode additionalInfo;
 
     public RuleMetaDataEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/TenantEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/TenantEntity.java
index a6e3ae6..e97fee3 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/TenantEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/TenantEntity.java
@@ -19,7 +19,6 @@ import java.util.UUID;
 
 import org.thingsboard.server.common.data.Tenant;
 import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 import org.thingsboard.server.dao.model.type.JsonCodec;
 
@@ -29,51 +28,52 @@ import com.datastax.driver.mapping.annotations.PartitionKey;
 import com.datastax.driver.mapping.annotations.Table;
 import com.datastax.driver.mapping.annotations.Transient;
 import com.fasterxml.jackson.databind.JsonNode;
+import static org.thingsboard.server.dao.model.ModelConstants.*;
 
-@Table(name = ModelConstants.TENANT_COLUMN_FAMILY_NAME)
+@Table(name = TENANT_COLUMN_FAMILY_NAME)
 public final class TenantEntity implements SearchTextEntity<Tenant> {
 
     @Transient
     private static final long serialVersionUID = -6198635547142409206L;
     
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
 
-    @Column(name = ModelConstants.TENANT_TITLE_PROPERTY)
+    @Column(name = TENANT_TITLE_PROPERTY)
     private String title;
     
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
 
-    @Column(name = ModelConstants.TENANT_REGION_PROPERTY)
+    @Column(name = TENANT_REGION_PROPERTY)
     private String region;
     
-    @Column(name = ModelConstants.COUNTRY_PROPERTY)
+    @Column(name = COUNTRY_PROPERTY)
     private String country;
     
-    @Column(name = ModelConstants.STATE_PROPERTY)
+    @Column(name = STATE_PROPERTY)
     private String state;
 
-    @Column(name = ModelConstants.CITY_PROPERTY)
+    @Column(name = CITY_PROPERTY)
     private String city;
 
-    @Column(name = ModelConstants.ADDRESS_PROPERTY)
+    @Column(name = ADDRESS_PROPERTY)
     private String address;
 
-    @Column(name = ModelConstants.ADDRESS2_PROPERTY)
+    @Column(name = ADDRESS2_PROPERTY)
     private String address2;
 
-    @Column(name = ModelConstants.ZIP_PROPERTY)
+    @Column(name = ZIP_PROPERTY)
     private String zip;
 
-    @Column(name = ModelConstants.PHONE_PROPERTY)
+    @Column(name = PHONE_PROPERTY)
     private String phone;
 
-    @Column(name = ModelConstants.EMAIL_PROPERTY)
+    @Column(name = EMAIL_PROPERTY)
     private String email;
 
-    @Column(name = ModelConstants.TENANT_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
+    @Column(name = TENANT_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
     private JsonNode additionalInfo;
 
     public TenantEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserCredentialsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserCredentialsEntity.java
index d571d0f..8aab37d 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserCredentialsEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserCredentialsEntity.java
@@ -27,31 +27,31 @@ import com.datastax.driver.mapping.annotations.PartitionKey;
 import com.datastax.driver.mapping.annotations.Table;
 import com.datastax.driver.mapping.annotations.Transient;
 import org.thingsboard.server.dao.model.BaseEntity;
-import org.thingsboard.server.dao.model.ModelConstants;
+import static org.thingsboard.server.dao.model.ModelConstants.*;
 
-@Table(name = ModelConstants.USER_CREDENTIALS_COLUMN_FAMILY_NAME)
+@Table(name = USER_CREDENTIALS_COLUMN_FAMILY_NAME)
 public final class UserCredentialsEntity implements BaseEntity<UserCredentials> {
 
     @Transient
     private static final long serialVersionUID = 1348221414123438374L;
     
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
     
-    @Column(name = ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY)
+    @Column(name = USER_CREDENTIALS_USER_ID_PROPERTY)
     private UUID userId;
 
-    @Column(name = ModelConstants.USER_CREDENTIALS_ENABLED_PROPERTY)
+    @Column(name = USER_CREDENTIALS_ENABLED_PROPERTY)
     private boolean enabled;
 
-    @Column(name = ModelConstants.USER_CREDENTIALS_PASSWORD_PROPERTY)
+    @Column(name = USER_CREDENTIALS_PASSWORD_PROPERTY)
     private String password;
 
-    @Column(name = ModelConstants.USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY)
+    @Column(name = USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY)
     private String activateToken;
 
-    @Column(name = ModelConstants.USER_CREDENTIALS_RESET_TOKEN_PROPERTY)
+    @Column(name = USER_CREDENTIALS_RESET_TOKEN_PROPERTY)
     private String resetToken;
 
     public UserCredentialsEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserEntity.java
index 91b9f3c..29beadd 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/UserEntity.java
@@ -22,7 +22,6 @@ import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.TenantId;
 import org.thingsboard.server.common.data.id.UserId;
 import org.thingsboard.server.common.data.security.Authority;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 import org.thingsboard.server.dao.model.type.AuthorityCodec;
 import org.thingsboard.server.dao.model.type.JsonCodec;
@@ -33,42 +32,43 @@ import com.datastax.driver.mapping.annotations.PartitionKey;
 import com.datastax.driver.mapping.annotations.Table;
 import com.datastax.driver.mapping.annotations.Transient;
 import com.fasterxml.jackson.databind.JsonNode;
+import static org.thingsboard.server.dao.model.ModelConstants.*;
 
-@Table(name = ModelConstants.USER_COLUMN_FAMILY_NAME)
+@Table(name = USER_COLUMN_FAMILY_NAME)
 public final class UserEntity implements SearchTextEntity<User> {
 
 	@Transient
 	private static final long serialVersionUID = -7740338274987723489L;
     
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
 
     @PartitionKey(value = 1)
-    @Column(name = ModelConstants.USER_TENANT_ID_PROPERTY)
+    @Column(name = USER_TENANT_ID_PROPERTY)
     private UUID tenantId;
 
     @PartitionKey(value = 2)
-    @Column(name = ModelConstants.USER_CUSTOMER_ID_PROPERTY)
+    @Column(name = USER_CUSTOMER_ID_PROPERTY)
     private UUID customerId;
 
     @PartitionKey(value = 3)
-    @Column(name = ModelConstants.USER_AUTHORITY_PROPERTY, codec = AuthorityCodec.class)
+    @Column(name = USER_AUTHORITY_PROPERTY, codec = AuthorityCodec.class)
     private Authority authority;
 
-    @Column(name = ModelConstants.USER_EMAIL_PROPERTY)
+    @Column(name = USER_EMAIL_PROPERTY)
     private String email;
     
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
     
-    @Column(name = ModelConstants.USER_FIRST_NAME_PROPERTY)
+    @Column(name = USER_FIRST_NAME_PROPERTY)
     private String firstName;
     
-    @Column(name = ModelConstants.USER_LAST_NAME_PROPERTY)
+    @Column(name = USER_LAST_NAME_PROPERTY)
     private String lastName;
 
-    @Column(name = ModelConstants.USER_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
+    @Column(name = USER_ADDITIONAL_INFO_PROPERTY, codec = JsonCodec.class)
     private JsonNode additionalInfo;
 
     public UserEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetsBundleEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetsBundleEntity.java
index 889f1d6..edec5bd 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetsBundleEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetsBundleEntity.java
@@ -24,36 +24,36 @@ import com.datastax.driver.mapping.annotations.Transient;
 import org.thingsboard.server.common.data.id.TenantId;
 import org.thingsboard.server.common.data.id.WidgetsBundleId;
 import org.thingsboard.server.common.data.widget.WidgetsBundle;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
+import static org.thingsboard.server.dao.model.ModelConstants.*;
 
 import java.nio.ByteBuffer;
 import java.util.UUID;
 
-@Table(name = ModelConstants.WIDGETS_BUNDLE_COLUMN_FAMILY_NAME)
+@Table(name = WIDGETS_BUNDLE_COLUMN_FAMILY_NAME)
 public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle> {
 
     @Transient
     private static final long serialVersionUID = -8842195928585650849L;
 
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
 
     @PartitionKey(value = 1)
-    @Column(name = ModelConstants.WIDGETS_BUNDLE_TENANT_ID_PROPERTY)
+    @Column(name = WIDGETS_BUNDLE_TENANT_ID_PROPERTY)
     private UUID tenantId;
 
-    @Column(name = ModelConstants.WIDGETS_BUNDLE_ALIAS_PROPERTY)
+    @Column(name = WIDGETS_BUNDLE_ALIAS_PROPERTY)
     private String alias;
 
-    @Column(name = ModelConstants.WIDGETS_BUNDLE_TITLE_PROPERTY)
+    @Column(name = WIDGETS_BUNDLE_TITLE_PROPERTY)
     private String title;
 
-    @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
+    @Column(name = SEARCH_TEXT_PROPERTY)
     private String searchText;
 
-    @Column(name = ModelConstants.WIDGETS_BUNDLE_IMAGE_PROPERTY)
+    @Column(name = WIDGETS_BUNDLE_IMAGE_PROPERTY)
     private ByteBuffer image;
 
     public WidgetsBundleEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetTypeEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetTypeEntity.java
index 4fd60f3..47db143 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetTypeEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/WidgetTypeEntity.java
@@ -25,36 +25,36 @@ import org.thingsboard.server.common.data.id.TenantId;
 import org.thingsboard.server.common.data.id.WidgetTypeId;
 import org.thingsboard.server.common.data.widget.WidgetType;
 import org.thingsboard.server.dao.model.BaseEntity;
-import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.type.JsonCodec;
+import static org.thingsboard.server.dao.model.ModelConstants.*;
 
 import java.util.UUID;
 
-@Table(name = ModelConstants.WIDGET_TYPE_COLUMN_FAMILY_NAME)
+@Table(name = WIDGET_TYPE_COLUMN_FAMILY_NAME)
 public final class WidgetTypeEntity implements BaseEntity<WidgetType> {
 
     @Transient
     private static final long serialVersionUID = 3591054897680176342L;
 
     @PartitionKey(value = 0)
-    @Column(name = ModelConstants.ID_PROPERTY)
+    @Column(name = ID_PROPERTY)
     private UUID id;
 
     @PartitionKey(value = 1)
-    @Column(name = ModelConstants.WIDGET_TYPE_TENANT_ID_PROPERTY)
+    @Column(name = WIDGET_TYPE_TENANT_ID_PROPERTY)
     private UUID tenantId;
 
     @PartitionKey(value = 2)
-    @Column(name = ModelConstants.WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY)
+    @Column(name = WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY)
     private String bundleAlias;
 
-    @Column(name = ModelConstants.WIDGET_TYPE_ALIAS_PROPERTY)
+    @Column(name = WIDGET_TYPE_ALIAS_PROPERTY)
     private String alias;
 
-    @Column(name = ModelConstants.WIDGET_TYPE_NAME_PROPERTY)
+    @Column(name = WIDGET_TYPE_NAME_PROPERTY)
     private String name;
 
-    @Column(name = ModelConstants.WIDGET_TYPE_DESCRIPTOR_PROPERTY, codec = JsonCodec.class)
+    @Column(name = WIDGET_TYPE_DESCRIPTOR_PROPERTY, codec = JsonCodec.class)
     private JsonNode descriptor;
 
     public WidgetTypeEntity() {
@@ -157,7 +157,7 @@ public final class WidgetTypeEntity implements BaseEntity<WidgetType> {
         sb.append(", tenantId=").append(tenantId);
         sb.append(", bundleAlias='").append(bundleAlias).append('\'');
         sb.append(", alias='").append(alias).append('\'');
-        sb.append(", name='").append(name).append('\'');
+        sb.append(", name ='").append(name).append('\'');
         sb.append(", descriptor=").append(descriptor);
         sb.append('}');
         return sb.toString();
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java
index a92e607..408c4f3 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java
@@ -33,7 +33,7 @@ import java.util.UUID;
 @Slf4j
 public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> implements Dao<D> {
 
-    protected abstract Class<E> getColumnFamilyClass();
+    protected abstract Class<E> getEntityClass();
 
     protected abstract String getColumnFamilyName();
 
@@ -47,7 +47,7 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> implements Dao<
     public D save(D domain) {
         E entity;
         try {
-            entity = getColumnFamilyClass().getConstructor(domain.getClass()).newInstance(domain);
+            entity = getEntityClass().getConstructor(domain.getClass()).newInstance(domain);
         } catch (Exception e) {
             log.error("Can't create entity for domain object {}", domain, e);
             throw new IllegalArgumentException("Can't create entity for domain object {" + domain + "}", e);
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
index 8fb14d7..551f658 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
@@ -19,10 +19,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.User;
+import org.thingsboard.server.common.data.page.TextPageLink;
+import org.thingsboard.server.dao.DaoUtil;
 import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.sql.UserEntity;
 import org.thingsboard.server.dao.sql.JpaAbstractDao;
+import org.thingsboard.server.dao.user.UserDao;
 
+import java.util.List;
 import java.util.UUID;
 
 /**
@@ -30,13 +34,13 @@ import java.util.UUID;
  */
 @Component
 @ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false)
-public class JpaUserDao extends JpaAbstractDao<UserEntity, User> {
+public class JpaUserDao extends JpaAbstractDao<UserEntity, User> implements UserDao {
 
     @Autowired
     private UserRepository userRepository;
 
     @Override
-    protected Class<UserEntity> getColumnFamilyClass() {
+    protected Class<UserEntity> getEntityClass() {
         return UserEntity.class;
     }
 
@@ -49,4 +53,19 @@ public class JpaUserDao extends JpaAbstractDao<UserEntity, User> {
     protected JpaRepository<UserEntity, UUID> getCrudRepository() {
         return userRepository;
     }
+
+    @Override
+    public User findByEmail(String email) {
+        return DaoUtil.getData(userRepository.findByEmail(email));
+    }
+
+    @Override
+    public List<User> findTenantAdmins(UUID tenantId, TextPageLink pageLink) {
+        return null;
+    }
+
+    @Override
+    public List<User> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) {
+        return null;
+    }
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
index 51364c7..a3bcfa6 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
@@ -15,12 +15,18 @@
  */
 package org.thingsboard.server.dao.sql.user;
 
+import org.thingsboard.server.common.data.User;
+import org.thingsboard.server.common.data.page.TextPageLink;
 import org.thingsboard.server.dao.model.sql.UserEntity;
 
+import java.util.List;
 import java.util.UUID;
 
 /**
  * @author Valerii Sosliuk
  */
 public interface UserRepository extends JpaRepository<UserEntity, UUID> {
+
+    UserEntity findByEmail(String email);
+
 }