--- date: 2021-02-07T19:26:34+02:00 title: "Notifications" toc: true draft: false menu: sidebar: parent: "development" --- # Notifications Vikunjs provides a simple abstraction to send notifications per mail and in the database. {{< table_of_contents >}} ## Definition Each notification has to implement this interface: ```golang type Notification interface { ToMail() *Mail ToDB() interface{} } ``` Both functions return the formatted messages for mail and database. A notification will only be sent or recorded for those of the two methods which don't return `nil`. For example, if your notification should not be recorded in the database but only sent out per mail, it is enough to let the `ToDB` function return `nil`. ### Mail notifications A list of chainable functions is available to compose a mail: ```golang mail := NewMail(). // The optional sender of the mail message. From("test@example.com"). // The optional receipient of the mail message. Uses the mail address of the notifiable if omitted. To("test@otherdomain.com"). // The subject of the mail to send. Subject("Testmail"). // The greeting, or "intro" line of the mail. Greeting("Hi there,"). // A line of text Line("This is a line of text"). // An action can contain a title and a url. It gets rendered as a big button in the mail. // Note that you can have only one action per mail. // All lines added before an action will appearr in the mail before the button, all lines // added afterwards will appear after it. Action("The Action", "https://example.com"). // Another line of text. Line("This should be an outro line"). ``` If not provided, the `from` field of the mail contains the value configured in [`mailer.fromemail`](https://vikunja.io/docs/config-options/#fromemail). ### Database notifications All data returned from the `ToDB()` method is serialized to json and saved into the database, along with the id of the notifiable and a time stamp. ## Creating a new notification The easiest way to generate a mail is by using the `mage dev:make-notification` command. It takes the name of the notification and the package where the notification will be created. ## Notifiables Notifiables can receive a notification. A notifiable is defined with this interface: ```golang type Notifiable interface { // Should return the email address this notifiable has. RouteForMail() string // Should return the id of the notifiable entity RouteForDB() int64 } ``` The `User` type from the `user` package implements this interface. ## Sending a notification Sending a notification is done with the `Notify` method from the `notifications` package. It takes a notifiable and a notification as input. For example, the email confirm notification when a new user registers is sent like this: ```golang n := &EmailConfirmNotification{ User: update.User, IsNew: false, } err = notifications.Notify(update.User, n) return ``` ## Testing The `mail` package provides a `Fake()` method which you should call in the `MainTest` functions of your package. If it was called, no mails are being sent and you can instead assert they have been sent with the `AssertSent` method. ## Example Take a look at the [pkg/user/notifications.go](https://code.vikunja.io/api/src/branch/master/pkg/user/notifications.go) file for a good example.