feat: add keeltime

This commit is contained in:
Kevin Franklin Kim 2022-01-03 13:20:06 +01:00
parent a1a8c3f47a
commit 1e7dc782c6
7 changed files with 58 additions and 10 deletions

View File

@ -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(),

View File

@ -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)
}
}

View File

@ -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)

View File

@ -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)

View File

@ -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(),
}
}

View File

@ -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

36
time/time.go Normal file
View File

@ -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
}