From 76e11a3e3ad4b0e336bca805ce454f92d5a04037 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Fri, 18 Oct 2019 09:46:50 +0200 Subject: [PATCH] Refactor current-time helpers --- compose/repository/chart.go | 8 +++---- compose/repository/module.go | 13 ++++------- compose/repository/namespace.go | 7 +++--- compose/repository/page.go | 7 +++--- messaging/repository/channel.go | 7 ++++-- messaging/repository/channel_member.go | 6 ++--- messaging/repository/message.go | 5 ++-- messaging/repository/util.go | 6 ----- messaging/repository/webhook.go | 3 ++- pkg/rh/time.go | 24 +++++++++++++++++++ pkg/rh/time_test.go | 32 ++++++++++++++++++++++++++ system/repository/application.go | 2 +- system/repository/organisation.go | 2 +- system/repository/reminder.go | 2 +- system/repository/role.go | 2 +- system/repository/user.go | 2 +- system/repository/util.go | 6 ----- 17 files changed, 89 insertions(+), 45 deletions(-) create mode 100644 pkg/rh/time.go create mode 100644 pkg/rh/time_test.go diff --git a/compose/repository/chart.go b/compose/repository/chart.go index 4474e3051..b3cf3ac2b 100644 --- a/compose/repository/chart.go +++ b/compose/repository/chart.go @@ -3,7 +3,6 @@ package repository import ( "context" "strings" - "time" "github.com/titpetric/factory" "gopkg.in/Masterminds/squirrel.v1" @@ -139,14 +138,15 @@ func (r chart) Find(filter types.ChartFilter) (set types.ChartSet, f types.Chart func (r chart) Create(mod *types.Chart) (*types.Chart, error) { mod.ID = factory.Sonyflake.NextID() - mod.CreatedAt = time.Now().Truncate(time.Second) + rh.SetCurrentTimeRounded(&mod.CreatedAt) + mod.UpdatedAt = nil return mod, r.db().Insert(r.table(), mod) } func (r chart) Update(mod *types.Chart) (*types.Chart, error) { - now := time.Now().Truncate(time.Second) - mod.UpdatedAt = &now + rh.SetCurrentTimeRounded(&mod.UpdatedAt) + return mod, r.db().Update(r.table(), mod, "id") } diff --git a/compose/repository/module.go b/compose/repository/module.go index 90d2ddec3..a5f98a6cc 100644 --- a/compose/repository/module.go +++ b/compose/repository/module.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "strings" - "time" "github.com/jmoiron/sqlx" "github.com/pkg/errors" @@ -162,7 +161,8 @@ func (r module) Create(mod *types.Module) (*types.Module, error) { var err error mod.ID = factory.Sonyflake.NextID() - mod.CreatedAt = time.Now().Truncate(time.Second) + rh.SetCurrentTimeRounded(&mod.CreatedAt) + mod.UpdatedAt = nil if err = r.db().Insert(r.table(), mod); err != nil { return nil, err @@ -172,8 +172,7 @@ func (r module) Create(mod *types.Module) (*types.Module, error) { } func (r module) Update(mod *types.Module) (*types.Module, error) { - now := time.Now().Truncate(time.Second) - mod.UpdatedAt = &now + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Update(r.table(), mod, "id") } @@ -195,7 +194,6 @@ func (r module) UpdateFields(moduleID uint64, ff types.ModuleFieldSet, hasRecord return err } - now := time.Now().Truncate(time.Second) for idx, f := range ff { if e := existing.FindByID(f.ID); e != nil { f.CreatedAt = e.CreatedAt @@ -207,7 +205,7 @@ func (r module) UpdateFields(moduleID uint64, ff types.ModuleFieldSet, hasRecord f.Name = e.Name f.Kind = e.Kind } else { - f.UpdatedAt = &now + rh.SetCurrentTimeRounded(&f.UpdatedAt) } } else { f.ID = 0 @@ -215,8 +213,7 @@ func (r module) UpdateFields(moduleID uint64, ff types.ModuleFieldSet, hasRecord if f.ID == 0 { f.ID = factory.Sonyflake.NextID() - f.CreatedAt = now - f.UpdatedAt = nil + rh.SetCurrentTimeRounded(&f.CreatedAt) } f.ModuleID = moduleID diff --git a/compose/repository/namespace.go b/compose/repository/namespace.go index 5abc7d178..749ecbaa4 100644 --- a/compose/repository/namespace.go +++ b/compose/repository/namespace.go @@ -3,7 +3,6 @@ package repository import ( "context" "strings" - "time" "github.com/titpetric/factory" "gopkg.in/Masterminds/squirrel.v1" @@ -137,14 +136,14 @@ func (r *namespace) Find(filter types.NamespaceFilter) (set types.NamespaceSet, func (r *namespace) Create(mod *types.Namespace) (*types.Namespace, error) { mod.ID = factory.Sonyflake.NextID() - mod.CreatedAt = time.Now() + rh.SetCurrentTimeRounded(&mod.CreatedAt) + mod.UpdatedAt = nil return mod, r.db().Insert(r.table(), mod) } func (r *namespace) Update(mod *types.Namespace) (*types.Namespace, error) { - now := time.Now() - mod.UpdatedAt = &now + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Update(r.table(), mod, "id") } diff --git a/compose/repository/page.go b/compose/repository/page.go index d73fc21c8..b2d6eea52 100644 --- a/compose/repository/page.go +++ b/compose/repository/page.go @@ -3,7 +3,6 @@ package repository import ( "context" "strings" - "time" "github.com/titpetric/factory" "gopkg.in/Masterminds/squirrel.v1" @@ -195,14 +194,14 @@ func (r page) Reorder(namespaceID, parentID uint64, pageIDs []uint64) error { func (r page) Create(mod *types.Page) (*types.Page, error) { mod.ID = factory.Sonyflake.NextID() - mod.CreatedAt = time.Now().Truncate(time.Second) + rh.SetCurrentTimeRounded(&mod.CreatedAt) + mod.UpdatedAt = nil return mod, r.db().Insert(r.table(), mod) } func (r page) Update(mod *types.Page) (*types.Page, error) { - now := time.Now().Truncate(time.Second) - mod.UpdatedAt = &now + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Update(r.table(), mod, "id") } diff --git a/messaging/repository/channel.go b/messaging/repository/channel.go index ac69655c3..9a43298a9 100644 --- a/messaging/repository/channel.go +++ b/messaging/repository/channel.go @@ -9,6 +9,7 @@ import ( "github.com/titpetric/factory" "github.com/cortezaproject/corteza-server/messaging/types" + "github.com/cortezaproject/corteza-server/pkg/rh" ) type ( @@ -144,7 +145,8 @@ func (r *channel) Find(filter *types.ChannelFilter) (types.ChannelSet, error) { func (r *channel) Create(mod *types.Channel) (*types.Channel, error) { mod.ID = factory.Sonyflake.NextID() - mod.CreatedAt = time.Now() + + rh.SetCurrentTimeRounded(&mod.CreatedAt) mod.UpdatedAt = nil if mod.Type == "" { @@ -155,7 +157,8 @@ func (r *channel) Create(mod *types.Channel) (*types.Channel, error) { } func (r *channel) Update(mod *types.Channel) (*types.Channel, error) { - mod.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&mod.UpdatedAt) + if mod.Type == "" { mod.Type = types.ChannelTypePublic } diff --git a/messaging/repository/channel_member.go b/messaging/repository/channel_member.go index 93da0de02..ea55fe909 100644 --- a/messaging/repository/channel_member.go +++ b/messaging/repository/channel_member.go @@ -2,11 +2,11 @@ package repository import ( "context" - "time" "github.com/titpetric/factory" "github.com/cortezaproject/corteza-server/messaging/types" + "github.com/cortezaproject/corteza-server/pkg/rh" ) type ( @@ -86,7 +86,7 @@ func (r *channelMember) Find(filter *types.ChannelMemberFilter) (types.ChannelMe // Create adds channel membership record func (r *channelMember) Create(mod *types.ChannelMember) (*types.ChannelMember, error) { - mod.CreatedAt = time.Now() + rh.SetCurrentTimeRounded(&mod.CreatedAt) mod.UpdatedAt = nil return mod, r.db().Insert("messaging_channel_member", mod) @@ -94,7 +94,7 @@ func (r *channelMember) Create(mod *types.ChannelMember) (*types.ChannelMember, // Update modifies existing channel membership record func (r *channelMember) Update(mod *types.ChannelMember) (*types.ChannelMember, error) { - mod.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&mod.UpdatedAt) whitelist := []string{"type", "flag", "updated_at", "rel_channel", "rel_user"} diff --git a/messaging/repository/message.go b/messaging/repository/message.go index bb3707fe1..28f2e1c51 100644 --- a/messaging/repository/message.go +++ b/messaging/repository/message.go @@ -11,6 +11,7 @@ import ( "github.com/titpetric/factory" "github.com/cortezaproject/corteza-server/messaging/types" + "github.com/cortezaproject/corteza-server/pkg/rh" ) type ( @@ -308,13 +309,13 @@ func (r *message) sanitizeFilter(filter *types.MessageFilter) { func (r *message) Create(mod *types.Message) (*types.Message, error) { mod.ID = factory.Sonyflake.NextID() - mod.CreatedAt = time.Now() + rh.SetCurrentTimeRounded(&mod.CreatedAt) return mod, r.db().Insert("messaging_message", mod) } func (r *message) Update(mod *types.Message) (*types.Message, error) { - mod.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Replace("messaging_message", mod) } diff --git a/messaging/repository/util.go b/messaging/repository/util.go index 320f0f153..c96201c77 100644 --- a/messaging/repository/util.go +++ b/messaging/repository/util.go @@ -2,7 +2,6 @@ package repository import ( "fmt" - "time" ) func (r repository) updateColumnByID(tableName, columnName string, value interface{}, id uint64) (err error) { @@ -26,8 +25,3 @@ func isFound(err error, valid bool, nerr error) error { return nil } - -func timeNowPtr() *time.Time { - n := time.Now() - return &n -} diff --git a/messaging/repository/webhook.go b/messaging/repository/webhook.go index 92fb14e15..5839e322a 100644 --- a/messaging/repository/webhook.go +++ b/messaging/repository/webhook.go @@ -8,6 +8,7 @@ import ( "github.com/titpetric/factory" "github.com/cortezaproject/corteza-server/messaging/types" + "github.com/cortezaproject/corteza-server/pkg/rh" ) type ( @@ -52,7 +53,7 @@ func (r *webhook) Create(webhook *types.Webhook) (*types.Webhook, error) { } func (r *webhook) Update(webhook *types.Webhook) (*types.Webhook, error) { - webhook.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&webhook.UpdatedAt) return webhook, errors.WithStack(r.db().Replace(r.webhook, webhook)) } diff --git a/pkg/rh/time.go b/pkg/rh/time.go new file mode 100644 index 000000000..9cf503223 --- /dev/null +++ b/pkg/rh/time.go @@ -0,0 +1,24 @@ +package rh + +import ( + "time" +) + +var ( + now = func() time.Time { + return time.Now() + } +) + +// SetCurrentTimeRounded sets current time (rounded to seconds) to a given ptr +func SetCurrentTimeRounded(v interface{}) { + n := now().Truncate(time.Second) + + switch t := v.(type) { + case *time.Time: + *t = n + case **time.Time: + _ = t + *t = &n + } +} diff --git a/pkg/rh/time_test.go b/pkg/rh/time_test.go new file mode 100644 index 000000000..bb1904011 --- /dev/null +++ b/pkg/rh/time_test.go @@ -0,0 +1,32 @@ +package rh + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestNow(t *testing.T) { + var ( + r = require.New(t) + + val time.Time + ptr *time.Time + inv1 int + inv2 string + ) + + SetCurrentTimeRounded(&val) + r.NotEmpty(val) + + SetCurrentTimeRounded(&ptr) + r.NotNil(ptr) + + SetCurrentTimeRounded(&inv1) + r.Empty(inv1) + + SetCurrentTimeRounded(&inv2) + r.Empty(inv2) + +} diff --git a/system/repository/application.go b/system/repository/application.go index 30da6f15f..e6317cb5e 100644 --- a/system/repository/application.go +++ b/system/repository/application.go @@ -122,7 +122,7 @@ func (r *application) Create(mod *types.Application) (*types.Application, error) } func (r *application) Update(mod *types.Application) (*types.Application, error) { - mod.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Replace(r.table(), mod) } diff --git a/system/repository/organisation.go b/system/repository/organisation.go index d6d43688f..cf76b6874 100644 --- a/system/repository/organisation.go +++ b/system/repository/organisation.go @@ -81,7 +81,7 @@ func (r *organisation) Create(mod *types.Organisation) (*types.Organisation, err } func (r *organisation) Update(mod *types.Organisation) (*types.Organisation, error) { - mod.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Replace(r.organisations, mod) } diff --git a/system/repository/reminder.go b/system/repository/reminder.go index c83274839..cc7bca995 100644 --- a/system/repository/reminder.go +++ b/system/repository/reminder.go @@ -158,7 +158,7 @@ func (r reminder) Create(mod *types.Reminder) (rm *types.Reminder, err error) { } func (r reminder) Update(mod *types.Reminder) (*types.Reminder, error) { - mod.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Replace(r.table(), mod) } diff --git a/system/repository/role.go b/system/repository/role.go index 20db1f9df..f2689c87e 100644 --- a/system/repository/role.go +++ b/system/repository/role.go @@ -188,7 +188,7 @@ func (r *role) Create(mod *types.Role) (*types.Role, error) { } func (r *role) Update(mod *types.Role) (*types.Role, error) { - mod.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Replace(r.table(), mod) } diff --git a/system/repository/user.go b/system/repository/user.go index 5750a91bd..b1fa5acec 100644 --- a/system/repository/user.go +++ b/system/repository/user.go @@ -217,7 +217,7 @@ func (r *user) Create(mod *types.User) (*types.User, error) { } func (r *user) Update(mod *types.User) (*types.User, error) { - mod.UpdatedAt = timeNowPtr() + rh.SetCurrentTimeRounded(&mod.UpdatedAt) return mod, r.db().Replace(r.table(), mod) } diff --git a/system/repository/util.go b/system/repository/util.go index 2b5f0d1b6..244e922fd 100644 --- a/system/repository/util.go +++ b/system/repository/util.go @@ -2,7 +2,6 @@ package repository import ( "fmt" - "time" "github.com/pkg/errors" ) @@ -17,8 +16,3 @@ func (r repository) updateColumnByID(tableName, columnName string, value interfa func exec(_ interface{}, err error) error { return errors.WithStack(err) } - -func timeNowPtr() *time.Time { - n := time.Now() - return &n -}