From d67554b63c1eee2df15e3c65d6bf2b6c608fe182 Mon Sep 17 00:00:00 2001 From: Ben Toogood Date: Thu, 4 Feb 2021 12:47:19 +0000 Subject: [PATCH] Update seen service to allow overriding values --- seen/handler/handler.go | 20 +++++++++++++++----- seen/handler/handler_test.go | 13 +++++++++++++ seen/main.go | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/seen/handler/handler.go b/seen/handler/handler.go index d3c0dcc..34cb5eb 100644 --- a/seen/handler/handler.go +++ b/seen/handler/handler.go @@ -6,6 +6,7 @@ import ( "gorm.io/gorm" + "github.com/google/uuid" "github.com/micro/micro/v3/service/errors" "github.com/micro/micro/v3/service/logger" pb "github.com/micro/services/seen/proto" @@ -25,6 +26,7 @@ type Seen struct { } type SeenInstance struct { + ID string UserID string `gorm:"uniqueIndex:user_resource"` ResourceID string `gorm:"uniqueIndex:user_resource"` ResourceType string `gorm:"uniqueIndex:user_resource"` @@ -49,14 +51,22 @@ func (s *Seen) Set(ctx context.Context, req *pb.SetRequest, rsp *pb.SetResponse) req.Timestamp = timestamppb.New(time.Now()) } - // write the object to the store - err := s.DB.Create(SeenInstance{ + // find the resource + instance := SeenInstance{ UserID: req.UserId, ResourceID: req.ResourceId, ResourceType: req.ResourceType, - Timestamp: req.Timestamp.AsTime(), - }).Error - if err != nil { + } + if err := s.DB.Where(&instance).First(&instance).Error; err == gorm.ErrRecordNotFound { + instance.ID = uuid.New().String() + } else if err != nil { + logger.Errorf("Error with store: %v", err) + return ErrStore + } + + // update the resource + instance.Timestamp = req.Timestamp.AsTime() + if err := s.DB.Save(&instance).Error; err != nil { logger.Errorf("Error with store: %v", err) return ErrStore } diff --git a/seen/handler/handler_test.go b/seen/handler/handler_test.go index 14335b5..f656ccd 100644 --- a/seen/handler/handler_test.go +++ b/seen/handler/handler_test.go @@ -74,6 +74,13 @@ func TestSet(t *testing.T) { ResourceID: uuid.New().String(), ResourceType: "message", }, + { + Name: "WithUpdatedTimetamp", + UserID: uuid.New().String(), + ResourceID: uuid.New().String(), + ResourceType: "message", + Timestamp: timestamppb.New(time.Now().Add(time.Minute * -3)), + }, } h := testHandler(t) @@ -164,6 +171,12 @@ func TestRead(t *testing.T) { ResourceType string Timestamp *timestamppb.Timestamp }{ + { + UserID: "user-1", + ResourceID: "message-1", + ResourceType: "message", + Timestamp: timestamppb.New(tn.Add(time.Minute * -10)), + }, { UserID: "user-1", ResourceID: "message-1", diff --git a/seen/main.go b/seen/main.go index 2b5aead..e737c71 100644 --- a/seen/main.go +++ b/seen/main.go @@ -35,7 +35,7 @@ func main() { } // Register handler - pb.RegisterSeenHandler(srv.Server(), &handler.Seen{DB: db}) + pb.RegisterSeenHandler(srv.Server(), &handler.Seen{DB: db.Debug()}) // Run service if err := srv.Run(); err != nil {