* feat(backend): small refactoring in integrations * feat(backend): ignore context timeout error
58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package model
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
const MAX_ATTEMPTS_IN_A_ROW = 4
|
|
const MAX_ATTEMPTS = 40
|
|
const ATTEMPTS_INTERVAL = 3 * 60 * 60 * 1000
|
|
|
|
type RequestInfo struct {
|
|
LastMessageId string
|
|
LastMessageTimestamp uint64
|
|
LastAttemptTimestamp int64
|
|
UnsuccessfullAttemptsCount int
|
|
}
|
|
|
|
func (c *RequestInfo) SetLastMessageTimestamp(timestamp uint64) {
|
|
if timestamp > c.LastMessageTimestamp {
|
|
c.LastMessageTimestamp = timestamp
|
|
}
|
|
}
|
|
func (c *RequestInfo) GetLastMessageTimestamp() uint64 {
|
|
return c.LastMessageTimestamp
|
|
}
|
|
func (c *RequestInfo) SetLastMessageId(timestamp uint64, id string) {
|
|
c.LastMessageId = id
|
|
c.LastMessageTimestamp = timestamp
|
|
}
|
|
func (c *RequestInfo) GetLastMessageId() string {
|
|
return c.LastMessageId
|
|
}
|
|
|
|
func (c *RequestInfo) CanAttempt() bool {
|
|
if c.UnsuccessfullAttemptsCount >= MAX_ATTEMPTS ||
|
|
(c.UnsuccessfullAttemptsCount >= MAX_ATTEMPTS_IN_A_ROW &&
|
|
time.Now().UnixMilli()-c.LastAttemptTimestamp < ATTEMPTS_INTERVAL) {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (c *RequestInfo) UpdateLastAttempt() {
|
|
c.LastAttemptTimestamp = time.Now().UnixMilli()
|
|
}
|
|
|
|
func (c *RequestInfo) Inc() {
|
|
c.UnsuccessfullAttemptsCount++
|
|
}
|
|
|
|
func (c *RequestInfo) Reset() {
|
|
c.UnsuccessfullAttemptsCount = 0
|
|
}
|
|
|
|
func (c *RequestInfo) Encode() ([]byte, error) {
|
|
return json.Marshal(c)
|
|
}
|