Packages
phoenix_kit
1.7.128
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/phoenix_kit/notifications/notification.ex
defmodule PhoenixKit.Notifications.Notification do
@moduledoc """
Schema for per-user notifications.
One row per (activity, recipient_user). Generated by
`PhoenixKit.Notifications.maybe_create_from_activity/1` whenever an activity
targets a user other than the actor.
## Fields
- `activity_uuid` — FK to `PhoenixKit.Activity.Entry`
- `recipient_uuid` — FK to `PhoenixKit.Users.Auth.User`
- `seen_at` — `NULL` until the user opens the notification or bulk-marks
- `dismissed_at` — `NULL` until the user dismisses it from the inbox
- `inserted_at` — creation timestamp (no `updated_at`)
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key {:uuid, UUIDv7, autogenerate: true}
@type t :: %__MODULE__{
uuid: UUIDv7.t() | nil,
activity_uuid: UUIDv7.t() | nil,
recipient_uuid: UUIDv7.t() | nil,
seen_at: DateTime.t() | nil,
dismissed_at: DateTime.t() | nil,
metadata: map() | nil,
inserted_at: DateTime.t() | nil,
activity: PhoenixKit.Activity.Entry.t() | Ecto.Association.NotLoaded.t() | nil,
recipient: PhoenixKit.Users.Auth.User.t() | Ecto.Association.NotLoaded.t() | nil
}
schema "phoenix_kit_notifications" do
belongs_to :activity, PhoenixKit.Activity.Entry,
foreign_key: :activity_uuid,
references: :uuid,
type: UUIDv7
belongs_to :recipient, PhoenixKit.Users.Auth.User,
foreign_key: :recipient_uuid,
references: :uuid,
type: UUIDv7
field :seen_at, :utc_datetime
field :dismissed_at, :utc_datetime
# Display content for a standalone notification (no activity). Render
# reads notification_text / notification_icon / notification_link from
# here — the same override keys it honors on activity metadata.
field :metadata, :map, default: %{}
timestamps(type: :utc_datetime, updated_at: false)
end
@doc "Changeset for creating a notification."
def changeset(notification, attrs) do
notification
|> cast(attrs, [:activity_uuid, :recipient_uuid, :seen_at, :dismissed_at, :metadata])
# Only recipient is required — `activity_uuid` is nil for standalone
# notifications (V126), where `metadata` carries the display content.
|> validate_required([:recipient_uuid])
|> foreign_key_constraint(:activity_uuid)
|> foreign_key_constraint(:recipient_uuid)
|> unique_constraint([:activity_uuid, :recipient_uuid],
name: :phoenix_kit_notifications_activity_recipient_index
)
end
end