-
Notifications
You must be signed in to change notification settings - Fork 71
/
Copy pathtriggers.ex
79 lines (70 loc) · 1.8 KB
/
triggers.ex
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
defmodule Cog.Repository.Triggers do
@moduledoc """
Behavioral API for interacting with triggers. Prefer these
functions over direct manipulation with `Cog.Repo`.
"""
alias Cog.Repo
alias Cog.Models.Trigger
require Ecto.Query
import Ecto.Query, only: [from: 2]
@doc """
Retrieve the definition of the given trigger. The given id must
be a valid UUID.
"""
@spec trigger_definition(String.t) :: {:ok, %Trigger{}} | {:error, :not_found | :bad_id}
def trigger_definition(id) do
if Cog.UUID.is_uuid?(id) do
case Repo.get(Trigger, id) do
%Trigger{} = trigger ->
{:ok, trigger}
nil ->
{:error, :not_found}
end
else
{:error, :bad_id}
end
end
@doc """
Create a new trigger given a map of attributes.
"""
@spec new(Map.t) :: {:ok, %Trigger{}} | {:error, Ecto.Changeset.t}
def new(attrs) do
%Trigger{}
|> Trigger.changeset(attrs)
|> Repo.insert
end
@doc """
Retrieve all triggers. Order is undefined.
"""
@spec all :: [%Trigger{}]
def all,
do: Repo.all(Trigger)
def by_name(name) do
case Repo.get_by(Trigger, name: name) do
%Trigger{} = trigger ->
{:ok, trigger}
nil ->
{:error, :not_found}
end
end
def delete(%Trigger{}=trigger) do
try do
Repo.delete(trigger)
rescue
Ecto.StaleEntryError ->
{:error, :not_found}
end
end
def delete(names) when is_list(names) do
# TODO: use returning: true with ecto 2.0 and Repo.delete_all; the
# return value here anticipates this
triggers = Repo.all(from t in Trigger, where: t.name in ^names)
Enum.each(triggers, &Repo.delete/1)
{length(triggers), triggers}
end
def update(%Trigger{}=trigger, attrs) do
trigger
|> Trigger.changeset(attrs)
|> Repo.update
end
end