diff --git a/pkg/events/events.go b/pkg/events/events.go index 98c126ee7..72fbfd8c9 100644 --- a/pkg/events/events.go +++ b/pkg/events/events.go @@ -32,10 +32,12 @@ import ( var pubsub *gochannel.GoChannel +// Event represents the event interface used by all events type Event interface { Name() string } +// InitEvents sets up everything needed to work with events func InitEvents() (err error) { logger := log.NewWatermillLogger() @@ -78,6 +80,7 @@ func InitEvents() (err error) { return router.Run(context.Background()) } +// Dispatch dispatches an event func Dispatch(event Event) error { if isUnderTest { dispatchedTestEvents = append(dispatchedTestEvents, event) diff --git a/pkg/events/listeners.go b/pkg/events/listeners.go index 3368c9a07..f0b1f4266 100644 --- a/pkg/events/listeners.go +++ b/pkg/events/listeners.go @@ -18,6 +18,7 @@ package events import "github.com/ThreeDotsLabs/watermill/message" +// Listener represents something that listens to events type Listener interface { Handle(payload message.Payload) error Name() string @@ -29,6 +30,7 @@ func init() { listeners = make(map[string][]Listener) } -func RegisterListener(topicName string, listener Listener) { - listeners[topicName] = append(listeners[topicName], listener) +// RegisterListener is used to register a listener when a specific event happens +func RegisterListener(name string, listener Listener) { + listeners[name] = append(listeners[name], listener) } diff --git a/pkg/events/testing.go b/pkg/events/testing.go index 4cf759f2c..bf105e110 100644 --- a/pkg/events/testing.go +++ b/pkg/events/testing.go @@ -17,8 +17,9 @@ package events import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) var ( diff --git a/pkg/initialize/init.go b/pkg/initialize/init.go index 26582b95c..24f9fae32 100644 --- a/pkg/initialize/init.go +++ b/pkg/initialize/init.go @@ -17,6 +17,8 @@ package initialize import ( + "time" + "code.vikunja.io/api/pkg/config" "code.vikunja.io/api/pkg/cron" "code.vikunja.io/api/pkg/events" @@ -29,7 +31,6 @@ import ( migrator "code.vikunja.io/api/pkg/modules/migration" "code.vikunja.io/api/pkg/red" "code.vikunja.io/api/pkg/user" - "time" ) // LightInit will only fullInit config, redis, logger but no db connection. diff --git a/pkg/integrations/integrations.go b/pkg/integrations/integrations.go index 33c081933..f9161e792 100644 --- a/pkg/integrations/integrations.go +++ b/pkg/integrations/integrations.go @@ -17,7 +17,6 @@ package integrations import ( - "code.vikunja.io/api/pkg/events" "net/http" "net/http/httptest" "net/url" @@ -25,6 +24,8 @@ import ( "strings" "testing" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/config" "code.vikunja.io/api/pkg/db" "code.vikunja.io/api/pkg/files" diff --git a/pkg/log/watermill_logger.go b/pkg/log/watermill_logger.go index 15e900115..4a6c4e418 100644 --- a/pkg/log/watermill_logger.go +++ b/pkg/log/watermill_logger.go @@ -24,7 +24,6 @@ import ( "code.vikunja.io/api/pkg/config" "github.com/ThreeDotsLabs/watermill" "github.com/op/go-logging" - "xorm.io/xorm/log" ) const watermillFmt = `%{color}%{time:` + time.RFC3339Nano + `}: %{level}` + "\t" + `▶ [EVENTS] %{id:03x}%{color:reset} %{message}` @@ -33,7 +32,6 @@ const watermillLogModule = `vikunja_events` type WatermillLogger struct { logger *logging.Logger - level log.LogLevel } func NewWatermillLogger() *WatermillLogger { diff --git a/pkg/models/events.go b/pkg/models/events.go index 705c14f2b..8b37fa0de 100644 --- a/pkg/models/events.go +++ b/pkg/models/events.go @@ -25,20 +25,24 @@ import ( // Task Events // ///////////////// +// TaskCreatedEvent represents an event where a task has been created type TaskCreatedEvent struct { Task *Task Doer web.Auth } +// Name defines the name for TaskCreatedEvent func (t *TaskCreatedEvent) Name() string { return "task.created" } +// TaskUpdatedEvent represents an event where a task has been updated type TaskUpdatedEvent struct { Task *Task Doer web.Auth } +// Name defines the name for TaskUpdatedEvent func (t *TaskUpdatedEvent) Name() string { return "task.updated" } @@ -49,27 +53,31 @@ type TaskDeletedEvent struct { Doer web.Auth } -// TopicName defines the name for TaskDeletedEvent +// Name defines the name for TaskDeletedEvent func (t *TaskDeletedEvent) Name() string { return "task.deleted" } +// TaskAssigneeCreatedEvent represents an event where a task has been assigned to a user type TaskAssigneeCreatedEvent struct { Task *Task Assignee *user.User Doer web.Auth } +// Name defines the name for TaskAssigneeCreatedEvent func (t *TaskAssigneeCreatedEvent) Name() string { return "task.assignee.created" } +// TaskCommentCreatedEvent represents an event where a task comment has been created type TaskCommentCreatedEvent struct { Task *Task Comment *TaskComment Doer web.Auth } +// Name defines the name for TaskCommentCreatedEvent func (t *TaskCommentCreatedEvent) Name() string { return "task.comment.created" } @@ -78,20 +86,24 @@ func (t *TaskCommentCreatedEvent) Name() string { // Namespace Events // ////////////////////// +// NamespaceCreatedEvent represents an event where a namespace has been created type NamespaceCreatedEvent struct { Namespace *Namespace Doer web.Auth } +// Name defines the name for NamespaceCreatedEvent func (n *NamespaceCreatedEvent) Name() string { return "namespace.created" } +// NamespaceUpdatedEvent represents an event where a namespace has been updated type NamespaceUpdatedEvent struct { Namespace *Namespace Doer web.Auth } +// Name defines the name for NamespaceUpdatedEvent func (n *NamespaceUpdatedEvent) Name() string { return "namespace.updated" } @@ -111,29 +123,35 @@ func (t *NamespaceDeletedEvent) Name() string { // List Events // ///////////////// +// ListCreatedEvent represents an event where a list has been created type ListCreatedEvent struct { List *List Doer web.Auth } +// Name defines the name for ListCreatedEvent func (l *ListCreatedEvent) Name() string { return "list.created" } +// ListUpdatedEvent represents an event where a list has been updated type ListUpdatedEvent struct { List *List Doer web.Auth } +// Name defines the name for ListUpdatedEvent func (l *ListUpdatedEvent) Name() string { return "list.updated" } +// ListDeletedEvent represents an event where a list has been deleted type ListDeletedEvent struct { List *List Doer web.Auth } +// Name defines the name for ListDeletedEvent func (t *ListDeletedEvent) Name() string { return "list.deleted" } @@ -142,42 +160,50 @@ func (t *ListDeletedEvent) Name() string { // Sharing Events // //////////////////// +// ListSharedWithUserEvent represents an event where a list has been shared with a user type ListSharedWithUserEvent struct { List *List User *user.User Doer web.Auth } +// Name defines the name for ListSharedWithUserEvent func (l *ListSharedWithUserEvent) Name() string { return "list.shared.user" } +// ListSharedWithTeamEvent represents an event where a list has been shared with a team type ListSharedWithTeamEvent struct { List *List Team *Team Doer web.Auth } +// Name defines the name for ListSharedWithTeamEvent func (l *ListSharedWithTeamEvent) Name() string { return "list.shared.team" } +// NamespaceSharedWithUserEvent represents an event where a namespace has been shared with a user type NamespaceSharedWithUserEvent struct { Namespace *Namespace User *user.User Doer web.Auth } +// Name defines the name for NamespaceSharedWithUserEvent func (n *NamespaceSharedWithUserEvent) Name() string { return "namespace.shared.user" } +// NamespaceSharedWithTeamEvent represents an event where a namespace has been shared with a team type NamespaceSharedWithTeamEvent struct { Namespace *Namespace Team *Team Doer web.Auth } +// Name defines the name for NamespaceSharedWithTeamEvent func (n *NamespaceSharedWithTeamEvent) Name() string { return "namespace.shared.team" } @@ -186,12 +212,14 @@ func (n *NamespaceSharedWithTeamEvent) Name() string { // Team Events // ///////////////// +// TeamMemberAddedEvent defines an event where a user is added to a team type TeamMemberAddedEvent struct { Team *Team Member *user.User Doer web.Auth } +// Name defines the name for TeamMemberAddedEvent func (t *TeamMemberAddedEvent) Name() string { return "team.member.added" } @@ -202,7 +230,7 @@ type TeamCreatedEvent struct { Doer web.Auth } -// TopicName defines the name for TeamCreatedEvent +// Name defines the name for TeamCreatedEvent func (t *TeamCreatedEvent) Name() string { return "team.created" } @@ -213,7 +241,7 @@ type TeamDeletedEvent struct { Doer web.Auth } -// TopicName defines the name for TeamDeletedEvent +// Name defines the name for TeamDeletedEvent func (t *TeamDeletedEvent) Name() string { return "team.deleted" } diff --git a/pkg/models/list.go b/pkg/models/list.go index 0064103d6..bfb31eba8 100644 --- a/pkg/models/list.go +++ b/pkg/models/list.go @@ -17,11 +17,12 @@ package models import ( - "code.vikunja.io/api/pkg/events" "strconv" "strings" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/log" "code.vikunja.io/api/pkg/files" diff --git a/pkg/models/list_team.go b/pkg/models/list_team.go index f0611f84e..5826e12fa 100644 --- a/pkg/models/list_team.go +++ b/pkg/models/list_team.go @@ -17,9 +17,10 @@ package models import ( - "code.vikunja.io/api/pkg/events" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/web" "xorm.io/xorm" ) @@ -111,6 +112,9 @@ func (tl *TeamList) Create(s *xorm.Session, a web.Auth) (err error) { Team: team, Doer: a, }) + if err != nil { + return err + } err = updateListLastUpdated(s, l) return diff --git a/pkg/models/list_users.go b/pkg/models/list_users.go index 5131eb074..e94ffca3c 100644 --- a/pkg/models/list_users.go +++ b/pkg/models/list_users.go @@ -17,9 +17,10 @@ package models import ( - "code.vikunja.io/api/pkg/events" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/user" "code.vikunja.io/web" "xorm.io/xorm" diff --git a/pkg/models/main_test.go b/pkg/models/main_test.go index 9dcf28cff..b16e3c629 100644 --- a/pkg/models/main_test.go +++ b/pkg/models/main_test.go @@ -17,12 +17,13 @@ package models import ( - "code.vikunja.io/api/pkg/events" "fmt" "os" "testing" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/config" "code.vikunja.io/api/pkg/files" "code.vikunja.io/api/pkg/user" diff --git a/pkg/models/namespace.go b/pkg/models/namespace.go index cd1197077..1ae379644 100644 --- a/pkg/models/namespace.go +++ b/pkg/models/namespace.go @@ -17,12 +17,13 @@ package models import ( - "code.vikunja.io/api/pkg/events" "sort" "strconv" "strings" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/log" "code.vikunja.io/api/pkg/user" "code.vikunja.io/web" diff --git a/pkg/models/namespace_team.go b/pkg/models/namespace_team.go index d18c70824..7df57ecca 100644 --- a/pkg/models/namespace_team.go +++ b/pkg/models/namespace_team.go @@ -17,9 +17,10 @@ package models import ( - "code.vikunja.io/api/pkg/events" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/web" "xorm.io/xorm" ) diff --git a/pkg/models/namespace_users.go b/pkg/models/namespace_users.go index 33f4e3ac4..5a13760b3 100644 --- a/pkg/models/namespace_users.go +++ b/pkg/models/namespace_users.go @@ -17,9 +17,10 @@ package models import ( - "code.vikunja.io/api/pkg/events" "time" + "code.vikunja.io/api/pkg/events" + user2 "code.vikunja.io/api/pkg/user" "code.vikunja.io/web" "xorm.io/xorm" diff --git a/pkg/models/task_assignees.go b/pkg/models/task_assignees.go index ee8e90166..8efa4b210 100644 --- a/pkg/models/task_assignees.go +++ b/pkg/models/task_assignees.go @@ -17,9 +17,10 @@ package models import ( - "code.vikunja.io/api/pkg/events" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/user" "code.vikunja.io/web" "xorm.io/xorm" diff --git a/pkg/models/task_comments.go b/pkg/models/task_comments.go index 4dac977e9..5ff3f7600 100644 --- a/pkg/models/task_comments.go +++ b/pkg/models/task_comments.go @@ -17,9 +17,10 @@ package models import ( - "code.vikunja.io/api/pkg/events" "time" + "code.vikunja.io/api/pkg/events" + "xorm.io/xorm" "code.vikunja.io/api/pkg/user" diff --git a/pkg/models/tasks.go b/pkg/models/tasks.go index 85a33f275..a71c0e143 100644 --- a/pkg/models/tasks.go +++ b/pkg/models/tasks.go @@ -17,12 +17,13 @@ package models import ( - "code.vikunja.io/api/pkg/events" "math" "sort" "strconv" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/db" "code.vikunja.io/api/pkg/config" diff --git a/pkg/models/tasks_test.go b/pkg/models/tasks_test.go index 722478b61..6b070ba7a 100644 --- a/pkg/models/tasks_test.go +++ b/pkg/models/tasks_test.go @@ -17,10 +17,11 @@ package models import ( - "code.vikunja.io/api/pkg/events" "testing" "time" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/db" "code.vikunja.io/api/pkg/user" "github.com/stretchr/testify/assert" diff --git a/pkg/models/teams.go b/pkg/models/teams.go index 487d310d8..717dd1b83 100644 --- a/pkg/models/teams.go +++ b/pkg/models/teams.go @@ -17,9 +17,10 @@ package models import ( - "code.vikunja.io/api/pkg/events" "time" + "code.vikunja.io/api/pkg/events" + "xorm.io/xorm" "code.vikunja.io/api/pkg/user" diff --git a/pkg/modules/auth/openid/main_test.go b/pkg/modules/auth/openid/main_test.go index 41c04fa74..051c2b14d 100644 --- a/pkg/modules/auth/openid/main_test.go +++ b/pkg/modules/auth/openid/main_test.go @@ -17,10 +17,11 @@ package openid import ( - "code.vikunja.io/api/pkg/events" "os" "testing" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/files" "code.vikunja.io/api/pkg/models" "code.vikunja.io/api/pkg/user" diff --git a/pkg/modules/migration/main_test.go b/pkg/modules/migration/main_test.go index 7e09c32f5..6c4908f0f 100644 --- a/pkg/modules/migration/main_test.go +++ b/pkg/modules/migration/main_test.go @@ -17,10 +17,11 @@ package migration import ( - "code.vikunja.io/api/pkg/events" "os" "testing" + "code.vikunja.io/api/pkg/events" + "code.vikunja.io/api/pkg/config" "code.vikunja.io/api/pkg/files" "code.vikunja.io/api/pkg/models" diff --git a/pkg/user/events.go b/pkg/user/events.go index 10d2104dd..0b07c9ea3 100644 --- a/pkg/user/events.go +++ b/pkg/user/events.go @@ -16,12 +16,12 @@ package user -// UserCreatedEvent represents a UserCreatedEvent event -type UserCreatedEvent struct { +// CreatedEvent represents a CreatedEvent event +type CreatedEvent struct { User *User } -// TopicName defines the name for UserCreatedEvent -func (t *UserCreatedEvent) Name() string { +// TopicName defines the name for CreatedEvent +func (t *CreatedEvent) Name() string { return "user.created" } diff --git a/pkg/user/listeners.go b/pkg/user/listeners.go index 37a74f4a5..572461b2c 100644 --- a/pkg/user/listeners.go +++ b/pkg/user/listeners.go @@ -24,7 +24,7 @@ import ( ) func RegisterListeners() { - events.RegisterListener((&UserCreatedEvent{}).Name(), &IncreaseUserCounter{}) + events.RegisterListener((&CreatedEvent{}).Name(), &IncreaseUserCounter{}) } /////// diff --git a/pkg/user/user_create.go b/pkg/user/user_create.go index bc865d8da..a1c6a757a 100644 --- a/pkg/user/user_create.go +++ b/pkg/user/user_create.go @@ -76,7 +76,7 @@ func CreateUser(s *xorm.Session, user *User) (newUser *User, err error) { return nil, err } - err = events.Dispatch(&UserCreatedEvent{ + err = events.Dispatch(&CreatedEvent{ User: newUserOut, }) if err != nil {