diff --git a/jwt/jwtclaims.go b/jwt/jwtclaims.go index 3297b48..001fceb 100644 --- a/jwt/jwtclaims.go +++ b/jwt/jwtclaims.go @@ -4,6 +4,8 @@ import ( "time" "github.com/golang-jwt/jwt" + + keeltime "github.com/foomo/keel/time" ) // MaxTimeDifferenceBetweenNodes represents an offset that should be taken @@ -11,7 +13,7 @@ import ( var MaxTimeDifferenceBetweenNodes = time.Second * 30 func NewStandardClaims() jwt.StandardClaims { - now := time.Now().Add(-MaxTimeDifferenceBetweenNodes) + now := keeltime.Now().Add(-MaxTimeDifferenceBetweenNodes) return jwt.StandardClaims{ IssuedAt: now.Unix(), NotBefore: now.Unix(), diff --git a/net/http/cookie/timeprovider.go b/net/http/cookie/timeprovider.go index ec621ec..f8e6b02 100644 --- a/net/http/cookie/timeprovider.go +++ b/net/http/cookie/timeprovider.go @@ -2,6 +2,8 @@ package cookie import ( "time" + + keeltime "github.com/foomo/keel/time" ) type TimeProvider func() time.Time @@ -31,6 +33,6 @@ func NewTimeProvider(opts ...TimeProviderOption) TimeProvider { } } return func() time.Time { - return time.Now().Add(options.Offset) + return keeltime.Now().Add(options.Offset) } } diff --git a/net/http/middleware/logger.go b/net/http/middleware/logger.go index 5ba4299..c3b1f90 100644 --- a/net/http/middleware/logger.go +++ b/net/http/middleware/logger.go @@ -7,6 +7,7 @@ import ( "go.uber.org/zap" "github.com/foomo/keel/log" + keeltime "github.com/foomo/keel/time" ) type ( @@ -45,7 +46,7 @@ func LoggerWithMessage(v string) LoggerOption { func LoggerWithOptions(opts LoggerOptions) Middleware { return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - start := time.Now() + start := keeltime.Now() // wrap response write to get access to status & size wr := WrapResponseWriter(w) diff --git a/net/http/middleware/responsetime.go b/net/http/middleware/responsetime.go index 20b5aff..8cad601 100644 --- a/net/http/middleware/responsetime.go +++ b/net/http/middleware/responsetime.go @@ -7,6 +7,7 @@ import ( "go.uber.org/zap" "github.com/foomo/keel/log" + keeltime "github.com/foomo/keel/time" ) type ( @@ -62,7 +63,7 @@ func ResponseTime(opts ...ResponseTimeOption) Middleware { func ResponseTimeWithOptions(opts ResponseTimeOptions) Middleware { return func(l *zap.Logger, name string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - start := time.Now() + start := keeltime.Now() rw := WrapResponseWriter(w) rw.SetWriteResponseTimeHeader(opts.SetHeader) next.ServeHTTP(rw, r) diff --git a/net/http/middleware/responsewriter.go b/net/http/middleware/responsewriter.go index 37f9a2c..1941568 100644 --- a/net/http/middleware/responsewriter.go +++ b/net/http/middleware/responsewriter.go @@ -7,6 +7,7 @@ import ( "time" http2 "github.com/foomo/keel/net/http" + keeltime "github.com/foomo/keel/time" ) // responseWriter is a wrapper that includes that http statusCode and size for logging @@ -25,7 +26,7 @@ func WrapResponseWriter(w http.ResponseWriter) *responseWriter { } return &responseWriter{ ResponseWriter: w, - start: time.Now(), + start: keeltime.Now(), } } diff --git a/persistence/mongo/collection.go b/persistence/mongo/collection.go index a36d60b..d25a844 100644 --- a/persistence/mongo/collection.go +++ b/persistence/mongo/collection.go @@ -15,6 +15,7 @@ import ( keelerrors "github.com/foomo/keel/errors" keelpersistence "github.com/foomo/keel/persistence" + keeltime "github.com/foomo/keel/time" ) type ( @@ -155,7 +156,7 @@ func (c *Collection) Upsert(ctx context.Context, id string, entity Entity) error } if v, ok := entity.(EntityWithTimestamps); ok { - now := time.Now() + now := keeltime.Now() if ct := v.GetCreatedAt(); ct.IsZero() { v.SetCreatedAt(now) } @@ -169,9 +170,7 @@ func (c *Collection) Upsert(ctx context.Context, id string, entity Entity) error if currentVersion == 0 { // insert the new document - if _, err := c.collection.InsertOne(ctx, entity); err != nil { - return err - } + return c.Insert(ctx, entity) } else if res := c.collection.FindOneAndUpdate( ctx, bson.D{{Key: "id", Value: id}, {Key: "version", Value: currentVersion}}, @@ -194,7 +193,13 @@ func (c *Collection) Upsert(ctx context.Context, id string, entity Entity) error return nil } -// Delete ... +func (c *Collection) Insert(ctx context.Context, entity Entity) error { + if _, err := c.collection.InsertOne(ctx, entity); err != nil { + return err + } + return nil +} + func (c *Collection) Delete(ctx context.Context, id string) error { if id == "" { return keelpersistence.ErrNotFound diff --git a/time/time.go b/time/time.go new file mode 100644 index 0000000..8b36c54 --- /dev/null +++ b/time/time.go @@ -0,0 +1,36 @@ +package keeltime + +import ( + "time" +) + +var ( + Now = time.Now + NowStaticNSec = int64(1609498800e9) // 2021-01-01 12:00:00 + NowIncrementalNSec = NowStaticNSec +) + +// Static sets now to a static time provider +func Static() { + Now = static +} + +// Incremental sets now to a incremental time provider +func Incremental() { + Now = incremental +} + +func static() time.Time { + return time.Unix(0, NowStaticNSec) +} + +func incremental() time.Time { + t := time.Unix(0, NowIncrementalNSec) + NowIncrementalNSec++ + return t +} + +// ResetIncremental sets the incremental time to the static default +func ResetIncremental() { + NowIncrementalNSec = NowStaticNSec +}