adds Firebase communication stump

- Firebase connection via Pigeon library
- sends bump to a single token at the moment
- encrypted test is sent as notification message
This commit is contained in:
2021-12-30 13:06:26 +01:00
parent 8262b61085
commit 745b0dc4f2
10 changed files with 148 additions and 45 deletions

View File

@ -15,15 +15,17 @@ defmodule Bump.Application do
# Start the PubSub system
{Phoenix.PubSub, name: Bump.PubSub},
# Start the Endpoint (http/https)
BumpWeb.Endpoint
BumpWeb.Endpoint,
# Start a worker by calling: Bump.Worker.start_link(arg)
# {Bump.Worker, arg}
Bump.FCM
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Bump.Supervisor]
Supervisor.start_link(children, opts)
end
# Tell Phoenix to update the endpoint configuration

62
lib/bump/database.ex Normal file
View File

@ -0,0 +1,62 @@
defmodule Bump.Database do
alias Bump.Repo
alias Bump.Messages.Message
import Ecto.Query
def pop(sender) do
query = from m in "messages",
where: m.sender == ^sender,
order_by: [desc: m.timestamp],
limit: 1,
select: %{id: m.id, data: m.data, timestamp: m.timestamp}
res = Repo.one(query)
if not is_nil(res) do
Repo.delete_all(from m in "messages", where: m.id == ^res.id)
%{data: res.data, timestamp: res.timestamp}
else
%{}
end
end
def peek(sender) do
query = from m in "messages",
where: m.sender == ^sender,
order_by: [desc: m.timestamp],
limit: 1,
select: %{data: m.data, timestamp: m.timestamp}
Repo.one(query)
end
def list(sender, minutes) do
ago = DateTime.utc_now
|> Timex.shift(minutes: -minutes)
|> DateTime.truncate(:second)
query = from m in "messages",
where: m.sender == ^sender and
m.timestamp >= ^ago,
select: %{data: m.data, timestamp: m.timestamp}
Repo.all(query)
end
def clear(sender) do
query = from m in "messages",
where: m.sender == ^sender
Repo.delete_all(query)
end
def push(sender, message) do
time = DateTime.utc_now |> DateTime.truncate(:second)
Repo.insert(%Message{sender: sender, data: message, timestamp: time})
end
end

14
lib/bump/firebase.ex Normal file
View File

@ -0,0 +1,14 @@
defmodule Bump.Firebase do
def test() do
IO.puts "Hello, world!"
end
def push(sender, message) do
IO.puts "Pushing #{message} to #{sender}"
n = Pigeon.FCM.Notification.new({:token, "dTm8S2bfTdKYQTjrxnwFFg:APA91bHGgM7IdRS5uxD0ljmwmP6cAec2icX0VBs69iRB2ApsohyOWzTzontO7cBkjNYbWV87zvxrXIs5jHkJ-8mSWa_-RiU2Y8-XEy3g-Fep3z6dhDeM3KazP58jDRgbdB5cVpDcIEWL"}, %{"body" => message})
Bump.FCM.push(n)
%{status: 'cheese'}
end
end

View File

@ -1,61 +1,26 @@
defmodule Bump.Messages do
alias Bump.Repo
alias Bump.Messages.Message
import Ecto.Query
alias Bump.Database
alias Bump.Firebase
def pop(sender) do
query = from m in "messages",
where: m.sender == ^sender,
order_by: [desc: m.timestamp],
limit: 1,
select: %{id: m.id, data: m.data, timestamp: m.timestamp}
res = Repo.one(query)
if not is_nil(res) do
Repo.delete_all(from m in "messages", where: m.id == ^res.id)
%{data: res.data, timestamp: res.timestamp}
else
%{}
end
Database.pop(sender)
end
def peek(sender) do
query = from m in "messages",
where: m.sender == ^sender,
order_by: [desc: m.timestamp],
limit: 1,
select: %{data: m.data, timestamp: m.timestamp}
Repo.one(query)
Database.peek(sender)
end
def list(sender, minutes) do
ago = DateTime.utc_now
|> Timex.shift(minutes: -minutes)
|> DateTime.truncate(:second)
query = from m in "messages",
where: m.sender == ^sender and
m.timestamp >= ^ago,
select: %{data: m.data, timestamp: m.timestamp}
Repo.all(query)
Database.list(sender, minutes)
end
def clear(sender) do
query = from m in "messages",
where: m.sender == ^sender
Repo.delete_all(query)
Database.clear(sender)
end
def push(sender, message) do
time = DateTime.utc_now |> DateTime.truncate(:second)
Repo.insert(%Message{sender: sender, data: message, timestamp: time})
Database.push(sender, message)
Firebase.push(sender, message)
end

4
lib/fcm.ex Normal file
View File

@ -0,0 +1,4 @@
# lib/fcm.ex
defmodule Bump.FCM do
use Pigeon.Dispatcher, otp_app: :bump
end