aboutsummaryrefslogtreecommitdiff
path: root/lib/db/schema.ex
blob: ec6f4e5e59316f71db62b9aec10273890d954041 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
defmodule Thulani.Schema do
  alias Thulani.Schema
  import Ecto.Changeset

  defmodule Meme do
    use Ecto.Schema

    schema "memes" do
      has_many(:invocation_records, Schema.InvocationRecord)

      field(:title, :string)
      field(:content, :string)

      belongs_to(:image, Schema.Image)
      belongs_to(:audio, Schema.Audio)

      belongs_to(:metadata, Schema.Metadata)
    end

    def insert_changeset(params \\ %{}) do
      changeset(%Meme{}, params)
    end

    def changeset(meme, params \\ %{}) do
      meme
      |> cast(params, [:title, :content, :image_id, :audio_id])
      |> validate_required([:title])
      |> cast_assoc(:image)
      |> cast_assoc(:audio)
      |> cast_assoc(:metadata, required: true)
      |> unique_constraint(:title, name: :text_memes_title_key)
    end
  end

  defmodule InvocationRecord do
    use Ecto.Schema

    schema "invocation_records" do
      field(:user_id, :integer)
      field(:message_id, :integer)
      field(:time, :utc_datetime_usec)
      field(:random, :boolean)

      belongs_to(:meme, Schema.Meme)
    end
  end

  defmodule Metadata do
    use Ecto.Schema

    schema "metadata" do
      has_one(:meme, Schema.Meme)
      has_one(:audio, Schema.Audio)
      has_one(:image, Schema.Image)

      field(:created, :utc_datetime_usec)
      field(:created_by, :integer)
    end

    def changeset(meta, params \\ %{}) do
      meta
      |> cast(params, [:created, :created_by])
      |> validate_required([:created, :created_by])
    end
  end

  defmodule Audio do
    use Ecto.Schema

    schema "audio" do
      belongs_to(:metadata, Schema.Metadata)
      has_many(:memes, Schema.Meme)

      field(:data, :binary)
      field(:data_hash, :binary)
    end

    def changeset(image, params \\ %{}) do
      image
      |> cast(params, [:data, :data_hash])
      |> cast_assoc(:metadata, required: true)
      |> validate_required([:data, :data_hash])
      |> unique_constraint(:data_hash, name: :image_hash)
    end
  end

  defmodule Image do
    use Ecto.Schema

    schema "images" do
      belongs_to(:metadata, Schema.Metadata)
      has_many(:memes, Schema.Meme)

      field(:data, :binary)
      field(:data_hash, :binary)
      field(:filename, :string)
    end

    def changeset(image, params \\ %{}) do
      image
      |> cast(params, [:data, :data_hash, :filename])
      |> cast_assoc(:metadata, required: true)
      |> validate_required([:data, :data_hash, :filename])
      |> unique_constraint(:data_hash, name: :image_hash)
    end
  end

  defmodule Tombstone do
    use Ecto.Schema

    schema "tombstones" do
      field(:meme_id, :integer)

      field(:deleted_by, :integer)
      field(:deleted_at, :utc_datetime_usec)

      belongs_to(:metadata, Schema.Metadata)
    end
  end
end