From 162557a0ec7cd90dcb328afc83be9155756d32de Mon Sep 17 00:00:00 2001
From: Gospodin Bodurov <gospodin@bodurov.net>
Date: Thu, 18 Apr 2019 13:58:00 +0300
Subject: [PATCH] Add activity delta modifications

---
 Gopkg.toml         |  2 +-
 config/configs.go  |  3 ++
 handler/handler.go | 80 ++++++++++++++++++++++++++++++++++++++++++++++
 utils/utils.go     |  6 ++++
 4 files changed, 90 insertions(+), 1 deletion(-)

diff --git a/Gopkg.toml b/Gopkg.toml
index 56fd415..83e3a32 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -1,5 +1,5 @@
 [[constraint]]
-  branch = "master"
+  branch = "activity_update"
   name = "code.vereign.com/code/viam-apis"
 
 [[constraint]]
diff --git a/config/configs.go b/config/configs.go
index a2d3773..1591a7a 100644
--- a/config/configs.go
+++ b/config/configs.go
@@ -25,6 +25,7 @@ var MaxMessageSize int
 var GrpcListenAddress string
 var RestListenAddress string
 var DataStorageUrl string
+var EntitiesManagerUrl string
 var CertDir string
 
 func SetConfigValues() {
@@ -34,6 +35,7 @@ func SetConfigValues() {
 	viper.SetDefault("grpcListenAddress", "localhost:7877")
 	viper.SetDefault("restListenAddress", "localhost:7878")
 	viper.SetDefault("dataStorageUrl", "localhost:7777")
+	viper.SetDefault("entitiesManagerUrl", "localhost:7779")
 
 	viper.SetDefault("viamUUID", "viam-system")
 	viper.SetDefault("viamSession", "viam-session")
@@ -106,6 +108,7 @@ func SetConfigValues() {
 	RestListenAddress = viper.GetString("restListenAddress")
 
 	DataStorageUrl = viper.GetString("dataStorageUrl")
+	EntitiesManagerUrl = viper.GetString("entitiesManagerUrl")
 
 	SystemAuth.Uuid = viper.GetString("viamUUID")
 	SystemAuth.Session = viper.GetString("viamSession")
diff --git a/handler/handler.go b/handler/handler.go
index c049ccd..aef13b5 100644
--- a/handler/handler.go
+++ b/handler/handler.go
@@ -18,9 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
 package handler
 
 import (
+	"encoding/base64"
+	"errors"
 	"log"
 	"strings"
 
+	"code.vereign.com/code/viam-apis/clientutils"
 	"code.vereign.com/code/viam-apis/versions"
 	"github.com/golang/protobuf/proto"
 
@@ -32,6 +35,10 @@ import (
 	"google.golang.org/grpc/metadata"
 )
 
+const (
+	keyToKeyIdTable = "authenticationKeyToKeyId"
+)
+
 // Server represents the gRPC server
 type KeyStorageServerImpl struct {
 	DataStorageUrl       string
@@ -165,6 +172,17 @@ func (s *KeyStorageServerImpl) SetKey(ctx context.Context, in *api.SetKeyRequest
 			"200", api.StatusType_INFO, result)
 	}
 
+	if in.KeyType == api.KeyType_PUBLIC {
+		keyContent := base64.StdEncoding.EncodeToString(in.Key.Content)
+
+		_, _, err = client.DoPutDataCallWithString(keyToKeyIdTable, keyContent,
+			in.Uuid, versions.EntitiesManagementAgentApiVersion)
+		if err != nil {
+			log.Printf("can't DoPutDataCallWithString: %s", err)
+			return nil, err
+		}
+	}
+
 	return setKeyResponse, nil
 }
 
@@ -209,6 +227,68 @@ func (s *KeyStorageServerImpl) ReserveKeyUUID(ctx context.Context, in *api.Reser
 	return reserveKeyUUIDResponse, nil
 }
 
+func (s *KeyStorageServerImpl) GetKeyId(ctx context.Context, in *api.GetKeyIdByKeyRequest) (*api.GetKeyIdByKeyResponse, error) {
+	auth := s.CreateAuthentication(ctx)
+	//in.PublicKey
+	entitiesMagamentClient := keyutils.CreateEntitiesManagementClient(auth)
+	defer entitiesMagamentClient.CloseClient()
+
+	dataStorageClient := keyutils.CreateDataStorageClient(auth)
+	defer dataStorageClient.CloseClient()
+
+	keyIdResponse := &api.GetKeyIdByKeyResponse{}
+
+	response, err := dataStorageClient.DoGetDataCall(keyToKeyIdTable, in.PublicKey)
+	if err == nil && response.Data != nil && response.Data.Data != nil {
+		keyID := string(response.Data.Data)
+		keyIdResponse.KeyId = keyID
+		return keyIdResponse, nil
+	}
+
+	entity, err := clientutils.GetLastEntity(entitiesMagamentClient, auth.Uuid)
+
+	if err != nil {
+		return nil, err
+	}
+
+	for _, checkID := range entity.AuthenticationKeys {
+		key := &api.Key{}
+
+		data, err := dataStorageClient.DoGetDataCall("keys", checkID+"/"+api.KeyType_PUBLIC.String())
+
+		if err != nil {
+			log.Printf("grpc call GetKeyId to DataStorage failed: %s", err)
+			return nil, err
+		}
+
+		if data.Errors != "" {
+			return nil, errors.New(data.Errors)
+		} else {
+			proto.Unmarshal(data.Data.Data, key)
+		}
+
+		keyFromStorage := base64.StdEncoding.EncodeToString(key.Content)
+
+		if in.PublicKey != keyFromStorage {
+			continue
+		}
+
+		_, _, err = dataStorageClient.DoPutDataCallWithString(keyToKeyIdTable, in.PublicKey,
+			checkID, versions.EntitiesManagementAgentApiVersion)
+		if err != nil {
+			log.Printf("can't DoPutDataCallWithString: %s", err)
+
+			return nil, err
+		}
+
+		keyIdResponse.KeyId = checkID
+		return keyIdResponse, nil
+	}
+
+	//getKeyFromContent
+	return keyIdResponse, nil
+}
+
 func (s *KeyStorageServerImpl) GetVersionKSA(ctx context.Context, in *api.GetVersionKSAMessage) (*api.GetVersionKSAResponseMessage, error) {
 	log.Println("Version: " + version)
 	return &api.GetVersionKSAResponseMessage{Version: version, Errors: ""}, nil
diff --git a/utils/utils.go b/utils/utils.go
index 1184090..aaf0720 100644
--- a/utils/utils.go
+++ b/utils/utils.go
@@ -33,6 +33,7 @@ import (
 	"code.vereign.com/code/viam-apis/clientutils"
 	"code.vereign.com/code/viam-apis/data-storage-agent/client"
 	dsclient "code.vereign.com/code/viam-apis/data-storage-agent/client"
+	emclient "code.vereign.com/code/viam-apis/entities-management-agent/client"
 	"code.vereign.com/code/viam-apis/key-storage-agent/api"
 	"code.vereign.com/code/viam-apis/utils"
 	"github.com/golang/protobuf/proto"
@@ -151,3 +152,8 @@ func CreateDataStorageClient(auth *authentication.Authentication) *dsclient.Data
 	return clientutils.CreateDataStorageClient(auth, config.DataStorageUrl, config.CertificatePEM,
 		config.PrivateKeyPEM, config.CaCertificatePEM, config.MaxMessageSize)
 }
+
+func CreateEntitiesManagementClient(auth *authentication.Authentication) *emclient.EntitiesManagerClientImpl {
+	return clientutils.CreateEntitiesManagementClient(auth, config.EntitiesManagerUrl, config.CertificatePEM,
+		config.PrivateKeyPEM, config.CaCertificatePEM, config.MaxMessageSize)
+}
-- 
GitLab