From 825cd6f21bc9d21a1bfb9991e250cfe1dcee3155 Mon Sep 17 00:00:00 2001 From: Abin Simon Date: Tue, 15 Nov 2022 10:24:06 +0530 Subject: [PATCH] Add created and modified time to all (#1452) ## Description Adds Created and Modified time to all objects. Need to go after https://github.com/alcionai/corso/pull/1446 as it is built on top of that. Keeping in draft until then. ## Type of change - [x] :sunflower: Feature - [ ] :bug: Bugfix - [ ] :world_map: Documentation - [ ] :robot: Test - [ ] :computer: CI/Deployment - [ ] :hamster: Trivial/Minor ## Issue(s) * https://github.com/alcionai/corso/issues/1366 ## Test Plan - [ ] :muscle: Manual - [x] :zap: Unit test - [ ] :green_heart: E2E Co-authored-by: aviator-app[bot] <48659329+aviator-app[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 1 - src/internal/connector/exchange/contact.go | 14 +++++++++ .../connector/exchange/contact_test.go | 19 ++++++++++-- src/internal/connector/exchange/event.go | 12 ++++++++ src/internal/connector/exchange/event_test.go | 14 ++++++++- src/internal/connector/exchange/message.go | 12 ++++++++ .../connector/exchange/message_test.go | 30 +++++++++++++++++-- src/pkg/backup/details/details.go | 7 ++++- src/pkg/backup/details/details_test.go | 4 ++- 9 files changed, 105 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a4059f2a8..c2c57c29c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,6 @@ name: Build/Release Corso on: workflow_dispatch: pull_request: - branches: [main] push: branches: [main] tags: ["v*.*.*"] diff --git a/src/internal/connector/exchange/contact.go b/src/internal/connector/exchange/contact.go index ac1440ff4..d2dbd2167 100644 --- a/src/internal/connector/exchange/contact.go +++ b/src/internal/connector/exchange/contact.go @@ -1,6 +1,8 @@ package exchange import ( + "time" + "github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/alcionai/corso/src/pkg/backup/details" @@ -9,13 +11,25 @@ import ( // ContactInfo translate models.Contactable metadata into searchable content func ContactInfo(contact models.Contactable) *details.ExchangeInfo { name := "" + created := time.Time{} + modified := time.Time{} if contact.GetDisplayName() != nil { name = *contact.GetDisplayName() } + if contact.GetCreatedDateTime() != nil { + created = *contact.GetCreatedDateTime() + } + + if contact.GetLastModifiedDateTime() != nil { + modified = *contact.GetLastModifiedDateTime() + } + return &details.ExchangeInfo{ ItemType: details.ExchangeContact, ContactName: name, + Created: created, + Modified: modified, } } diff --git a/src/internal/connector/exchange/contact_test.go b/src/internal/connector/exchange/contact_test.go index e67898891..3ca8f5f91 100644 --- a/src/internal/connector/exchange/contact_test.go +++ b/src/internal/connector/exchange/contact_test.go @@ -2,6 +2,7 @@ package exchange import ( "testing" + "time" "github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/stretchr/testify/assert" @@ -19,6 +20,8 @@ func TestContactSuite(t *testing.T) { } func (suite *ContactSuite) TestContactInfo() { + initial := time.Now() + tests := []struct { name string contactAndRP func() (models.Contactable, *details.ExchangeInfo) @@ -26,18 +29,30 @@ func (suite *ContactSuite) TestContactInfo() { { name: "Empty Contact", contactAndRP: func() (models.Contactable, *details.ExchangeInfo) { - i := &details.ExchangeInfo{ItemType: details.ExchangeContact} - return models.NewContact(), i + contact := models.NewContact() + contact.SetCreatedDateTime(&initial) + contact.SetLastModifiedDateTime(&initial) + + i := &details.ExchangeInfo{ + ItemType: details.ExchangeContact, + Created: initial, + Modified: initial, + } + return contact, i }, }, { name: "Only Name", contactAndRP: func() (models.Contactable, *details.ExchangeInfo) { aPerson := "Whole Person" contact := models.NewContact() + contact.SetCreatedDateTime(&initial) + contact.SetLastModifiedDateTime(&initial) contact.SetDisplayName(&aPerson) i := &details.ExchangeInfo{ ItemType: details.ExchangeContact, ContactName: aPerson, + Created: initial, + Modified: initial, } return contact, i }, diff --git a/src/internal/connector/exchange/event.go b/src/internal/connector/exchange/event.go index bb97b1d7a..9ac2efc7f 100644 --- a/src/internal/connector/exchange/event.go +++ b/src/internal/connector/exchange/event.go @@ -16,6 +16,8 @@ func EventInfo(evt models.Eventable) *details.ExchangeInfo { recurs bool start = time.Time{} end = time.Time{} + created = time.Time{} + modified = time.Time{} ) if evt.GetOrganizer() != nil && @@ -58,6 +60,14 @@ func EventInfo(evt models.Eventable) *details.ExchangeInfo { } } + if evt.GetCreatedDateTime() != nil { + created = *evt.GetCreatedDateTime() + } + + if evt.GetLastModifiedDateTime() != nil { + modified = *evt.GetLastModifiedDateTime() + } + return &details.ExchangeInfo{ ItemType: details.ExchangeEvent, Organizer: organizer, @@ -65,5 +75,7 @@ func EventInfo(evt models.Eventable) *details.ExchangeInfo { EventStart: start, EventEnd: end, EventRecurs: recurs, + Created: created, + Modified: modified, } } diff --git a/src/internal/connector/exchange/event_test.go b/src/internal/connector/exchange/event_test.go index 4f532150a..c8f4cd697 100644 --- a/src/internal/connector/exchange/event_test.go +++ b/src/internal/connector/exchange/event_test.go @@ -38,7 +38,13 @@ func (suite *EventSuite) TestEventInfo() { { name: "Empty event", evtAndRP: func() (models.Eventable, *details.ExchangeInfo) { - return models.NewEvent(), &details.ExchangeInfo{ + event := models.NewEvent() + + // Start and Modified will always be available in API + event.SetCreatedDateTime(&initial) + event.SetLastModifiedDateTime(&initial) + + return event, &details.ExchangeInfo{ ItemType: details.ExchangeEvent, } }, @@ -51,6 +57,8 @@ func (suite *EventSuite) TestEventInfo() { dateTime = models.NewDateTimeTimeZone() ) + event.SetCreatedDateTime(&initial) + event.SetLastModifiedDateTime(&initial) dateTime.SetDateTime(&now) event.SetStart(dateTime) @@ -70,6 +78,8 @@ func (suite *EventSuite) TestEventInfo() { endTime = models.NewDateTimeTimeZone() ) + event.SetCreatedDateTime(&initial) + event.SetLastModifiedDateTime(&initial) startTime.SetDateTime(&now) event.SetStart(startTime) @@ -93,6 +103,8 @@ func (suite *EventSuite) TestEventInfo() { event = models.NewEvent() ) + event.SetCreatedDateTime(&initial) + event.SetLastModifiedDateTime(&initial) event.SetSubject(&subject) return event, &details.ExchangeInfo{ diff --git a/src/internal/connector/exchange/message.go b/src/internal/connector/exchange/message.go index e0728141f..eb28c6e06 100644 --- a/src/internal/connector/exchange/message.go +++ b/src/internal/connector/exchange/message.go @@ -12,6 +12,8 @@ func MessageInfo(msg models.Messageable) *details.ExchangeInfo { sender := "" subject := "" received := time.Time{} + created := time.Time{} + modified := time.Time{} if msg.GetSender() != nil && msg.GetSender().GetEmailAddress() != nil && @@ -27,10 +29,20 @@ func MessageInfo(msg models.Messageable) *details.ExchangeInfo { received = *msg.GetReceivedDateTime() } + if msg.GetCreatedDateTime() != nil { + created = *msg.GetCreatedDateTime() + } + + if msg.GetLastModifiedDateTime() != nil { + modified = *msg.GetLastModifiedDateTime() + } + return &details.ExchangeInfo{ ItemType: details.ExchangeMail, Sender: sender, Subject: subject, Received: received, + Created: created, + Modified: modified, } } diff --git a/src/internal/connector/exchange/message_test.go b/src/internal/connector/exchange/message_test.go index ea352722d..1908820a2 100644 --- a/src/internal/connector/exchange/message_test.go +++ b/src/internal/connector/exchange/message_test.go @@ -19,6 +19,8 @@ func TestMessageSuite(t *testing.T) { } func (suite *MessageSuite) TestMessageInfo() { + initial := time.Now() + tests := []struct { name string msgAndRP func() (models.Messageable, *details.ExchangeInfo) @@ -26,8 +28,16 @@ func (suite *MessageSuite) TestMessageInfo() { { name: "Empty message", msgAndRP: func() (models.Messageable, *details.ExchangeInfo) { - i := &details.ExchangeInfo{ItemType: details.ExchangeMail} - return models.NewMessage(), i + msg := models.NewMessage() + msg.SetCreatedDateTime(&initial) + msg.SetLastModifiedDateTime(&initial) + + i := &details.ExchangeInfo{ + ItemType: details.ExchangeMail, + Created: initial, + Modified: initial, + } + return msg, i }, }, { @@ -39,10 +49,14 @@ func (suite *MessageSuite) TestMessageInfo() { msg := models.NewMessage() sea.SetAddress(&sender) sr.SetEmailAddress(sea) + msg.SetCreatedDateTime(&initial) + msg.SetLastModifiedDateTime(&initial) msg.SetSender(sr) i := &details.ExchangeInfo{ ItemType: details.ExchangeMail, Sender: sender, + Created: initial, + Modified: initial, } return msg, i }, @@ -53,9 +67,13 @@ func (suite *MessageSuite) TestMessageInfo() { subject := "Hello world" msg := models.NewMessage() msg.SetSubject(&subject) + msg.SetCreatedDateTime(&initial) + msg.SetLastModifiedDateTime(&initial) i := &details.ExchangeInfo{ ItemType: details.ExchangeMail, Subject: subject, + Created: initial, + Modified: initial, } return msg, i }, @@ -65,10 +83,14 @@ func (suite *MessageSuite) TestMessageInfo() { msgAndRP: func() (models.Messageable, *details.ExchangeInfo) { now := time.Now() msg := models.NewMessage() + msg.SetCreatedDateTime(&initial) + msg.SetLastModifiedDateTime(&initial) msg.SetReceivedDateTime(&now) i := &details.ExchangeInfo{ ItemType: details.ExchangeMail, Received: now, + Created: initial, + Modified: initial, } return msg, i }, @@ -82,6 +104,8 @@ func (suite *MessageSuite) TestMessageInfo() { sr := models.NewRecipient() sea := models.NewEmailAddress() msg := models.NewMessage() + msg.SetCreatedDateTime(&initial) + msg.SetLastModifiedDateTime(&initial) sea.SetAddress(&sender) sr.SetEmailAddress(sea) msg.SetSender(sr) @@ -92,6 +116,8 @@ func (suite *MessageSuite) TestMessageInfo() { Sender: sender, Subject: subject, Received: now, + Created: initial, + Modified: initial, } return msg, i }, diff --git a/src/pkg/backup/details/details.go b/src/pkg/backup/details/details.go index 2282764e0..431f082ae 100644 --- a/src/pkg/backup/details/details.go +++ b/src/pkg/backup/details/details.go @@ -302,6 +302,8 @@ type ExchangeInfo struct { Organizer string `json:"organizer,omitempty"` ContactName string `json:"contactName,omitempty"` EventRecurs bool `json:"eventRecurs,omitempty"` + Created time.Time `json:"created,omitempty"` + Modified time.Time `json:"modified,omitempty"` } // Headers returns the human-readable names of properties in an ExchangeInfo @@ -338,7 +340,10 @@ func (i ExchangeInfo) Values() []string { return []string{i.ContactName} case ExchangeMail: - return []string{i.Sender, i.Subject, common.FormatTabularDisplayTime(i.Received)} + return []string{ + i.Sender, i.Subject, + common.FormatTabularDisplayTime(i.Received), + } } return []string{} diff --git a/src/pkg/backup/details/details_test.go b/src/pkg/backup/details/details_test.go index c309dd5a8..f007fd63c 100644 --- a/src/pkg/backup/details/details_test.go +++ b/src/pkg/backup/details/details_test.go @@ -2,6 +2,7 @@ package details_test import ( "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -24,7 +25,8 @@ func TestDetailsUnitSuite(t *testing.T) { } func (suite *DetailsUnitSuite) TestDetailsEntry_HeadersValues() { - nowStr := common.FormatNow(common.TabularOutput) + initial := time.Now() + nowStr := common.FormatTimeWith(initial, common.TabularOutput) now, err := common.ParseTime(nowStr) require.NoError(suite.T(), err)