defmodule Plausible do
@moduledoc """
## Status
Currently the project is under development. All contributions are welcome.
## V0.1.0 Roadmap
1. Add `__using__/1` macro to `Plausible` so to allow usages like
```elixir
defmodule MyApp.Plausible do
use Plausible, finch: MyApp.Finch
end
```
with this you can use `Plausible.create_event(opts)` instead of `Plausible.create_event/3`
2. Add documentation for `Plausible.FinchSupervisor` and the usage so the host app can create a finch process and the supervision
for the finch process on the app instead of under library supervision, which will help when in umbrella app case, where
two or more apps in the umbrella can have this library as dependency, but the finch processes will be spawn and supervised seperately
on host apps
"""
@doc """
Create Plausible Event
Currently only returns `:ok`
## Examples
iex> create_event("https://plausible.io/api/event", MyApp.Finch, user_agent: user_agent, x_forward_for: x_forwarded_for, url: url, domain: domain)
:ok
"""
def create_event(endpoint \\ "https://plausible.io/api/event", finch_process, opts) do
user_agent =
opts[:user_agent] ||
raise """
user_agent not defined
"""
x_forwarded_for =
opts[:x_forwarded_for] ||
raise """
x_forwarded_for not defined
"""
domain =
opts[:domain] ||
raise """
domain not defined
"""
url =
opts[:url] ||
raise """
url not defined
"""
referrer = opts[:referrer]
event_name = opts[:event_name] || "pageview"
body = %{name: event_name, url: url, referrer: referrer, domain: domain} |> Jason.encode!()
# TODO handle custom properties
%Finch.Response{status: 202} =
Finch.build(
:post,
endpoint,
[
{"User-Agent", user_agent},
{"X-Forwarded-For", x_forwarded_for},
{"Content-Type", "application/json"}
],
body
)
|> Finch.request!(finch_process)
:ok
end
end