put event implementations into their own file
Signed-off-by: Ava Affine <ava@sunnypup.io>
This commit is contained in:
parent
0dae469cce
commit
4e0709959b
2 changed files with 175 additions and 165 deletions
175
internal/state/events.go
Normal file
175
internal/state/events.go
Normal file
|
|
@ -0,0 +1,175 @@
|
||||||
|
package state
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"gitlab.com/whom/bingobot/internal/logging"
|
||||||
|
)
|
||||||
|
|
||||||
|
type VoteEvent map[string]string
|
||||||
|
|
||||||
|
const (
|
||||||
|
VoteMissingKeyError = "vote data not found: "
|
||||||
|
VoteCreatedKey = "created"
|
||||||
|
VoteRequesterKey = "requester"
|
||||||
|
VoteActionKey = "action"
|
||||||
|
|
||||||
|
VoteResultKey = "result"
|
||||||
|
VoteResultPass = "pass"
|
||||||
|
VoteResultFail = "fail"
|
||||||
|
VoteResultTie = "tie"
|
||||||
|
VoteResultTimeout = "timeout"
|
||||||
|
VoteBadResultError = "vote has invalid result: "
|
||||||
|
VoteNotFinishedError = "vote has result but isnt finished"
|
||||||
|
VoteMissingResultError = "vote finished but missing result"
|
||||||
|
|
||||||
|
VoteStatusKey = "status"
|
||||||
|
VoteStatusInProgress = "in_progress"
|
||||||
|
VoteStatusFinalized = "finalized"
|
||||||
|
VoteStatusTimeout = "timed_out"
|
||||||
|
VoteBadStatusError = "vote has invalid status: "
|
||||||
|
|
||||||
|
VeryOldVote = "1990-01-01T00:00:00Z"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (ve VoteEvent) Type() EventType {
|
||||||
|
return Vote
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ve VoteEvent) Time() time.Time {
|
||||||
|
t, e := time.Parse(time.RFC3339, ve[VoteCreatedKey])
|
||||||
|
if e != nil {
|
||||||
|
// we have a corrupted event
|
||||||
|
// return old time so that this event gets
|
||||||
|
// pruned from cache
|
||||||
|
logging.Warn(
|
||||||
|
"pruning corrupted vote event",
|
||||||
|
"event",
|
||||||
|
fmt.Sprintf("%+v", ve),
|
||||||
|
)
|
||||||
|
tooOld, _ := time.Parse(
|
||||||
|
time.RFC3339,
|
||||||
|
VeryOldVote,
|
||||||
|
)
|
||||||
|
return tooOld
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ve VoteEvent) Data() map[string]string {
|
||||||
|
return map[string]string(ve)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ve VoteEvent) Validate() error {
|
||||||
|
// make sure action, requester, and created are set
|
||||||
|
for _, key := range []string{
|
||||||
|
VoteActionKey,
|
||||||
|
VoteRequesterKey,
|
||||||
|
VoteCreatedKey,
|
||||||
|
VoteStatusKey,
|
||||||
|
} {
|
||||||
|
if _, found := ve[key]; !found {
|
||||||
|
return errors.New(VoteMissingKeyError + key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status := ve[VoteStatusKey]
|
||||||
|
if status != VoteStatusTimeout &&
|
||||||
|
status != VoteStatusInProgress &&
|
||||||
|
status != VoteStatusFinalized {
|
||||||
|
return errors.New(VoteBadStatusError + status)
|
||||||
|
}
|
||||||
|
|
||||||
|
result, hasResult := ve[VoteResultKey]
|
||||||
|
if hasResult && status == VoteStatusInProgress {
|
||||||
|
return errors.New(VoteNotFinishedError)
|
||||||
|
}
|
||||||
|
if status != VoteStatusInProgress && !hasResult {
|
||||||
|
return errors.New(VoteMissingResultError)
|
||||||
|
}
|
||||||
|
|
||||||
|
if hasResult &&
|
||||||
|
(result != VoteResultPass &&
|
||||||
|
result != VoteResultFail &&
|
||||||
|
result != VoteResultTie &&
|
||||||
|
result != VoteResultTimeout) {
|
||||||
|
|
||||||
|
return errors.New(VoteBadResultError + result)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserEvent struct {
|
||||||
|
uid string
|
||||||
|
created time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
UserEventUserKey = "user"
|
||||||
|
UserEventCreatedKey = "created"
|
||||||
|
UserEventBadUserError = "event has bad user"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (ue UserEvent) Time() time.Time {
|
||||||
|
return ue.created
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ue UserEvent) Data() map[string]string {
|
||||||
|
return map[string]string{
|
||||||
|
UserEventUserKey: ue.uid,
|
||||||
|
UserEventCreatedKey: ue.created.Format(time.RFC3339),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ue UserEvent) Validate() error {
|
||||||
|
// empty for now, we may do some validation later.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ChallengeEvent struct {
|
||||||
|
UserEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ce ChallengeEvent) Type() EventType {
|
||||||
|
return Challenge
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeEvent(user string) ChallengeEvent {
|
||||||
|
return ChallengeEvent{UserEvent{
|
||||||
|
uid: user,
|
||||||
|
created: time.Now(),
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
type RestorationEvent struct {
|
||||||
|
UserEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
func (re RestorationEvent) Type() EventType {
|
||||||
|
return Restoration
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRestorationEvent(user string) RestorationEvent {
|
||||||
|
return RestorationEvent{UserEvent{
|
||||||
|
uid: user,
|
||||||
|
created: time.Now(),
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserActiveEvent struct {
|
||||||
|
UserEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ua UserActiveEvent) Type() EventType {
|
||||||
|
return UserActive
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUserActiveEvent(user string) UserActiveEvent {
|
||||||
|
return UserActiveEvent{UserEvent{
|
||||||
|
uid: user,
|
||||||
|
created: time.Now(),
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
@ -394,168 +394,3 @@ func GetMatchingEvents(
|
||||||
return matches, err
|
return matches, err
|
||||||
}
|
}
|
||||||
|
|
||||||
type VoteEvent map[string]string
|
|
||||||
|
|
||||||
const (
|
|
||||||
VoteMissingKeyError = "vote data not found: "
|
|
||||||
VoteCreatedKey = "created"
|
|
||||||
VoteRequesterKey = "requester"
|
|
||||||
VoteActionKey = "action"
|
|
||||||
|
|
||||||
VoteResultKey = "result"
|
|
||||||
VoteResultPass = "pass"
|
|
||||||
VoteResultFail = "fail"
|
|
||||||
VoteResultTie = "tie"
|
|
||||||
VoteResultTimeout = "timeout"
|
|
||||||
VoteBadResultError = "vote has invalid result: "
|
|
||||||
VoteNotFinishedError = "vote has result but isnt finished"
|
|
||||||
VoteMissingResultError = "vote finished but missing result"
|
|
||||||
|
|
||||||
VoteStatusKey = "status"
|
|
||||||
VoteStatusInProgress = "in_progress"
|
|
||||||
VoteStatusFinalized = "finalized"
|
|
||||||
VoteStatusTimeout = "timed_out"
|
|
||||||
VoteBadStatusError = "vote has invalid status: "
|
|
||||||
|
|
||||||
VeryOldVote = "1990-01-01T00:00:00Z"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (ve VoteEvent) Type() EventType {
|
|
||||||
return Vote
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ve VoteEvent) Time() time.Time {
|
|
||||||
t, e := time.Parse(time.RFC3339, ve[VoteCreatedKey])
|
|
||||||
if e != nil {
|
|
||||||
// we have a corrupted event
|
|
||||||
// return old time so that this event gets
|
|
||||||
// pruned from cache
|
|
||||||
logging.Warn(
|
|
||||||
"pruning corrupted vote event",
|
|
||||||
"event",
|
|
||||||
fmt.Sprintf("%+v", ve),
|
|
||||||
)
|
|
||||||
tooOld, _ := time.Parse(
|
|
||||||
time.RFC3339,
|
|
||||||
VeryOldVote,
|
|
||||||
)
|
|
||||||
return tooOld
|
|
||||||
}
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ve VoteEvent) Data() map[string]string {
|
|
||||||
return map[string]string(ve)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ve VoteEvent) Validate() error {
|
|
||||||
// make sure action, requester, and created are set
|
|
||||||
for _, key := range []string{
|
|
||||||
VoteActionKey,
|
|
||||||
VoteRequesterKey,
|
|
||||||
VoteCreatedKey,
|
|
||||||
VoteStatusKey,
|
|
||||||
} {
|
|
||||||
if _, found := ve[key]; !found {
|
|
||||||
return errors.New(VoteMissingKeyError + key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
status := ve[VoteStatusKey]
|
|
||||||
if status != VoteStatusTimeout &&
|
|
||||||
status != VoteStatusInProgress &&
|
|
||||||
status != VoteStatusFinalized {
|
|
||||||
return errors.New(VoteBadStatusError + status)
|
|
||||||
}
|
|
||||||
|
|
||||||
result, hasResult := ve[VoteResultKey]
|
|
||||||
if hasResult && status == VoteStatusInProgress {
|
|
||||||
return errors.New(VoteNotFinishedError)
|
|
||||||
}
|
|
||||||
if status != VoteStatusInProgress && !hasResult {
|
|
||||||
return errors.New(VoteMissingResultError)
|
|
||||||
}
|
|
||||||
|
|
||||||
if hasResult &&
|
|
||||||
(result != VoteResultPass &&
|
|
||||||
result != VoteResultFail &&
|
|
||||||
result != VoteResultTie &&
|
|
||||||
result != VoteResultTimeout) {
|
|
||||||
|
|
||||||
return errors.New(VoteBadResultError + result)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type UserEvent struct {
|
|
||||||
uid string
|
|
||||||
created time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
UserEventUserKey = "user"
|
|
||||||
UserEventCreatedKey = "created"
|
|
||||||
UserEventBadUserError = "event has bad user"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (ue UserEvent) Time() time.Time {
|
|
||||||
return ue.created
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ue UserEvent) Data() map[string]string {
|
|
||||||
return map[string]string{
|
|
||||||
UserEventUserKey: ue.uid,
|
|
||||||
UserEventCreatedKey: ue.created.Format(time.RFC3339),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ue UserEvent) Validate() error {
|
|
||||||
// empty for now, we may do some validation later.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type ChallengeEvent struct {
|
|
||||||
UserEvent
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ce ChallengeEvent) Type() EventType {
|
|
||||||
return Challenge
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewChallengeEvent(user string) ChallengeEvent {
|
|
||||||
return ChallengeEvent{UserEvent{
|
|
||||||
uid: user,
|
|
||||||
created: time.Now(),
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
type RestorationEvent struct {
|
|
||||||
UserEvent
|
|
||||||
}
|
|
||||||
|
|
||||||
func (re RestorationEvent) Type() EventType {
|
|
||||||
return Restoration
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewRestorationEvent(user string) RestorationEvent {
|
|
||||||
return RestorationEvent{UserEvent{
|
|
||||||
uid: user,
|
|
||||||
created: time.Now(),
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
type UserActiveEvent struct {
|
|
||||||
UserEvent
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ua UserActiveEvent) Type() EventType {
|
|
||||||
return UserActive
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUserActiveEvent(user string) UserActiveEvent {
|
|
||||||
return UserActiveEvent{UserEvent{
|
|
||||||
uid: user,
|
|
||||||
created: time.Now(),
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue