ChatController: Add creation and return of chats.
[akkoma] / lib / pleroma / chat.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Chat do
6 use Ecto.Schema
7 import Ecto.Changeset
8
9 alias Pleroma.User
10 alias Pleroma.Repo
11
12 @moduledoc """
13 Chat keeps a reference to ChatMessage conversations between a user and an recipient. The recipient can be a user (for now) or a group (not implemented yet).
14
15 It is a helper only, to make it easy to display a list of chats with other people, ordered by last bump. The actual messages are retrieved by querying the recipients of the ChatMessages.
16 """
17
18 schema "chats" do
19 belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
20 field(:recipient, :string)
21 field(:unread, :integer, default: 0, read_after_writes: true)
22
23 timestamps()
24 end
25
26 def creation_cng(struct, params) do
27 struct
28 |> cast(params, [:user_id, :recipient, :unread])
29 |> validate_required([:user_id, :recipient])
30 |> unique_constraint(:user_id, name: :chats_user_id_recipient_index)
31 end
32
33 def get(user_id, recipient) do
34 __MODULE__
35 |> Repo.get_by(user_id: user_id, recipient: recipient)
36 end
37
38 def get_or_create(user_id, recipient) do
39 %__MODULE__{}
40 |> creation_cng(%{user_id: user_id, recipient: recipient})
41 |> Repo.insert(
42 on_conflict: :nothing,
43 returning: true,
44 conflict_target: [:user_id, :recipient]
45 )
46 end
47
48 def bump_or_create(user_id, recipient) do
49 %__MODULE__{}
50 |> creation_cng(%{user_id: user_id, recipient: recipient, unread: 1})
51 |> Repo.insert(
52 on_conflict: [set: [updated_at: NaiveDateTime.utc_now()], inc: [unread: 1]],
53 conflict_target: [:user_id, :recipient]
54 )
55 end
56 end