Skip to content

Commit

Permalink
Add some warnings
Browse files Browse the repository at this point in the history
  • Loading branch information
Loïc Knuchel committed Nov 9, 2023
1 parent f46fdbe commit f31156d
Show file tree
Hide file tree
Showing 23 changed files with 133 additions and 77 deletions.
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export PHX_SERVER=true
export PHX_HOST=localhost
export PORT=4000
export SECRET_KEY_BASE=CHANGE_ME
# export LICENCE_KEY=lce_...

export DATABASE_URL=postgresql://postgres:postgres@localhost/azimutt_dev
# export DATABASE_IPV6=true
Expand Down
1 change: 1 addition & 0 deletions INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ These are the basic variables you will **need** to set up Azimutt:
- `PHX_HOST` (required): host of the deployed website (ex: `localhost` or `azimutt.app`), it's used to build absolute urls
- `PORT` (required): the port the server will listen to (ex: `4000`)
- `SECRET_KEY_BASE` (required): the secret used for server encryption (cookies and others), should be at least 64 bytes and you probably want a random value for it
- `LICENCE_KEY` (optional): the licence key to unlock the pro features, contact us if you need one ([email protected])
- `DATABASE_URL` (required): the whole url to connect to your PostgreSQL database (ex: `postgresql://<user>:<pass>@<host>:<port>/<database>`)
- `DATABASE_IPV6` (optional): if `true`, the database driver will use IPV6
- `DATABASE_POOL_SIZE` (optional, default: `10`): the database connection pool size
Expand Down
2 changes: 1 addition & 1 deletion backend/.credo.exs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@
{Credo.Check.Readability.RedundantBlankLines, []},
{Credo.Check.Readability.Semicolons, []},
{Credo.Check.Readability.SpaceAfterCommas, []},
{Credo.Check.Readability.StringSigils, []},
{Credo.Check.Readability.StringSigils, [maximum_allowed_quotes: 4]},
{Credo.Check.Readability.TrailingBlankLine, []},
{Credo.Check.Readability.TrailingWhiteSpace, []},
{Credo.Check.Readability.UnnecessaryAliasExpansion, []},
Expand Down
15 changes: 8 additions & 7 deletions backend/config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@ config :azimutt,
cli_url: "https://www.npmjs.com/package/azimutt",
heroku_url: "https://elements.heroku.com/addons/azimutt",
browser_extension_url: "https://chrome.google.com/webstore/detail/azimutt/bpifdkechgdibghkkpaioccoijeoebjf",
documentation_url: "https://docs.azimutt.app",
github_url: "https://github.com/azimuttapp/azimutt",
github_issues: "https://github.com/azimuttapp/azimutt/issues",
github_new_issue: "https://github.com/azimuttapp/azimutt/issues/new",
twitter_url: "https://twitter.com/azimuttapp",
linkedin_url: "https://www.linkedin.com/company/azimuttapp",
slack_url: "https://join.slack.com/t/azimutt/shared_invite/zt-1pumru3pj-iBKIq7f~7ADOfySuxuFA2Q",
azimutt_documentation: "https://docs.azimutt.app",
azimutt_email: "[email protected]",
azimutt_twitter: "https://twitter.com/azimuttapp",
azimutt_linkedin: "https://www.linkedin.com/company/azimuttapp",
azimutt_slack: "https://join.slack.com/t/azimutt/shared_invite/zt-1pumru3pj-iBKIq7f~7ADOfySuxuFA2Q",
azimutt_github: "https://github.com/azimuttapp/azimutt",
azimutt_github_issues: "https://github.com/azimuttapp/azimutt/issues",
azimutt_github_issues_new: "https://github.com/azimuttapp/azimutt/issues/new",
pro_plan_seat_price: 13,
free_plan_seats: 3,
# MUST stay in sync with frontend/src/Conf.elm (`features`)
Expand Down
1 change: 1 addition & 0 deletions backend/config/runtime.exs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ global_organization = System.get_env("GLOBAL_ORGANIZATION")

config :azimutt,
host: host,
licence: System.get_env("LICENCE_KEY"),
gateway_url: System.get_env("GATEWAY_URL") || "/api/v1/analyzer",
skip_public_site: !(System.get_env("PUBLIC_SITE") == "true"),
skip_onboarding_funnel: System.get_env("SKIP_ONBOARDING_FUNNEL") == "true",
Expand Down
4 changes: 4 additions & 0 deletions backend/lib/azimutt.ex
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ defmodule Azimutt do
Application.get_env(:azimutt, key, default)
end

def set_config(key, value) when is_atom(key) do
Application.put_env(:azimutt, key, value)
end

def plans do
# Next ones: Explore ($3), Expand ($13), Extend ($25)
[
Expand Down
2 changes: 1 addition & 1 deletion backend/lib/azimutt/application.ex
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ defmodule Azimutt.Application do
res = Supervisor.start_link(children, opts)

check_global_organization()
CockpitSrv.boot_check()
CockpitSrv.on_boot()

res
end
Expand Down
39 changes: 22 additions & 17 deletions backend/lib/azimutt/organizations.ex
Original file line number Diff line number Diff line change
Expand Up @@ -330,51 +330,56 @@ defmodule Azimutt.Organizations do
end

def get_organization_plan(%Organization{} = organization) do
plans = Azimutt.config(:instance_plans) || ["free"]

cond do
organization.clever_cloud_resource -> clever_cloud_plan(organization.clever_cloud_resource)
organization.heroku_resource -> heroku_plan(organization.heroku_resource)
organization.stripe_subscription_id && StripeSrv.stripe_configured?() -> stripe_plan(organization.stripe_subscription_id)
true -> default_plan()
organization.clever_cloud_resource -> clever_cloud_plan(plans, organization.clever_cloud_resource)
organization.heroku_resource -> heroku_plan(plans, organization.heroku_resource)
organization.stripe_subscription_id && StripeSrv.stripe_configured?() -> stripe_plan(plans, organization.stripe_subscription_id)
true -> default_plan(plans)
end
|> Result.map(fn plan -> plan_overrides(organization, plan) end)
|> Result.map(fn plan -> plan_overrides(plans, organization, plan) end)
end

defp clever_cloud_plan(%CleverCloud.Resource{} = resource) do
if resource.plan |> String.starts_with?("pro-") do
defp clever_cloud_plan(plans, %CleverCloud.Resource{} = resource) do
if resource.plan |> String.starts_with?("pro-") && plans |> Enum.member?("pro") do
{:ok, OrganizationPlan.pro()}
else
{:ok, OrganizationPlan.free()}
end
end

defp heroku_plan(%Heroku.Resource{} = resource) do
if resource.plan |> String.starts_with?("pro-") || resource.plan == "test" do
defp heroku_plan(plans, %Heroku.Resource{} = resource) do
if (resource.plan |> String.starts_with?("pro-") || resource.plan == "test") && plans |> Enum.member?("pro") do
{:ok, OrganizationPlan.pro()}
else
{:ok, OrganizationPlan.free()}
end
end

defp stripe_plan(subscription_id) do
defp stripe_plan(plans, subscription_id) do
StripeSrv.get_subscription(subscription_id)
|> Result.map(fn s ->
if s.status == "active" || s.status == "past_due" || s.status == "unpaid" do
if (s.status == "active" || s.status == "past_due" || s.status == "unpaid") && plans |> Enum.member?("pro") do
OrganizationPlan.pro()
else
OrganizationPlan.free()
end
end)
end

def default_plan do
case Azimutt.config(:organization_default_plan) do
"pro" -> {:ok, OrganizationPlan.pro()}
_ -> {:ok, OrganizationPlan.free()}
def default_plan(plans) do
plan = Azimutt.config(:organization_default_plan)

if plan == "pro" && plans |> Enum.member?("pro") do
{:ok, OrganizationPlan.pro()}
else
{:ok, OrganizationPlan.free()}
end
end

defp plan_overrides(%Organization{} = organization, %OrganizationPlan{} = plan) do
if organization.data != nil do
defp plan_overrides(plans, %Organization{} = organization, %OrganizationPlan{} = plan) do
if organization.data != nil && plans |> Enum.member?("pro") do
plan
|> override_layouts(organization.data)
|> override_memos(organization.data)
Expand Down
67 changes: 51 additions & 16 deletions backend/lib/azimutt/services/cockpit_srv.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,47 @@ defmodule Azimutt.Services.CockpitSrv do
alias Azimutt.Utils.Result
alias Azimutt.Utils.Stringx

def boot_check do
# TODO: add code version
post("/api/check", %{
instance: Azimutt.config(:host),
environment: Azimutt.config(:environment),
db: db_stats(),
config: instance_conf()
})

def on_boot do
check(true)
Runner.start_link()
end

def server_up do
post("/api/events", %{
def check(startup) do
# TODO: add code version
post("/api/licences/check", %{
instance: Azimutt.config(:host),
environment: Azimutt.config(:environment),
name: "server_up",
details: %{},
entities: [],
createdAt: DateTime.utc_now()
licence: Azimutt.config(:licence),
startup: startup,
db: db_stats(),
config: instance_conf()
})
|> Result.fold(
fn _ ->
set_error_message(
"Unable to reach licence server, please make sure to allow access or contact us: <a href=\"mailto:#{Azimutt.config(:azimutt_email)}\" class=\"font-bold underline\">#{Azimutt.config(:azimutt_email)}</a>."
)
end,
fn res ->
Azimutt.set_config(:instance_plans, res["plans"])

cond do
res["error"] != nil ->
set_error_message(res["error"])

res["warning"] != nil ->
set_warning_message(res["warning"])

res["status"] != 200 ->
set_warning_message(
"Licence server returned <b>status #{res["status"]}</b>, please contact us at <a href=\"mailto:#{Azimutt.config(:azimutt_email)}\" class=\"font-bold underline\">#{Azimutt.config(:azimutt_email)}</a>."
)

true ->
clear_message()
end
end
)
end

def send_event(%Event{} = event) do
Expand Down Expand Up @@ -66,7 +86,7 @@ defmodule Azimutt.Services.CockpitSrv do

@impl true
def handle_info(:work, state) do
CockpitSrv.server_up()
CockpitSrv.check(false)
{:noreply, state}
end
end
Expand Down Expand Up @@ -196,4 +216,19 @@ defmodule Azimutt.Services.CockpitSrv do
updated_at: project.updated_at
}
end

defp set_error_message(message) do
Azimutt.set_config(:instance_message_color, "red")
Azimutt.set_config(:instance_message, message)
end

defp set_warning_message(message) do
Azimutt.set_config(:instance_message_color, "yellow")
Azimutt.set_config(:instance_message, message)
end

defp clear_message do
Azimutt.set_config(:instance_message_color, nil)
Azimutt.set_config(:instance_message, nil)
end
end
6 changes: 3 additions & 3 deletions backend/lib/azimutt/utils/markdown.ex
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,16 @@ defmodule Azimutt.Utils.Markdown do
end

def preprocess(content, path) do
github = "https://github.com/azimuttapp/azimutt"
github = Azimutt.config(:azimutt_github)

content
|> String.replace("{{base_link}}", base_link(path))
|> String.replace("{{app_link}}", "/home")
|> String.replace("{{roadmap_link}}", "#{github}/projects/1")
|> String.replace("{{issues_link}}", "#{github}/issues?q=is%3Aissue+is%3Aopen+label%3A%22feature+request%22")
|> String.replace("{{feedback_link}}", "#{github}/discussions")
|> String.replace("{{azimutt_twitter}}", "https://twitter.com/azimuttapp")
|> String.replace("{{azimutt_email}}", "[email protected]")
|> String.replace("{{azimutt_twitter}}", Azimutt.config(:azimutt_twitter))
|> String.replace("{{azimutt_email}}", Azimutt.config(:azimutt_email))
end

def base_link(path), do: path |> String.split("/") |> Enum.drop(2) |> Enum.take(2) |> Enum.map_join(fn p -> "/#{p}" end)
Expand Down
2 changes: 1 addition & 1 deletion backend/lib/azimutt_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ defmodule AzimuttWeb.Router do
description: "API Documentation for Azimutt Backend",
contact: %{
name: "Azimutt",
email: "[email protected]"
email: Azimutt.config(:azimutt_email)
}
},
consumes: ["application/json"],
Expand Down
6 changes: 3 additions & 3 deletions backend/lib/azimutt_web/templates/blog/_blog_footer.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@
</div>
</div>
<div class="flex justify-center pt-4 space-x-4 align-center">
<a href={Azimutt.config(:github_url)} rel="noopener noreferrer" aria-label="GitHub" class="p-2 rounded-md">
<a href={Azimutt.config(:azimutt_github)} rel="noopener noreferrer" aria-label="GitHub" class="p-2 rounded-md">
<svg viewBox="0 0 496 512" xmlns="http://www.w3.org/2000/svg" class="w-4 h-4 fill-current">
<path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path>
</svg>
</a>
<a href={Azimutt.config(:twitter_url)} rel="noopener noreferrer" aria-label="Twitter" class="p-2 rounded-md">
<a href={Azimutt.config(:azimutt_twitter)} rel="noopener noreferrer" aria-label="Twitter" class="p-2 rounded-md">
<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" class="w-4 h-4 fill-current">
<path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path>
</svg>
</a>
<a href={"mailto:#{Azimutt.config(:support_email)}"} rel="noopener noreferrer" aria-label="Email" class="p-2 rounded-md">
<a href={"mailto:#{Azimutt.config(:azimutt_email)}"} rel="noopener noreferrer" aria-label="Email" class="p-2 rounded-md">
<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" class="w-4 h-4 fill-current">
<path d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z"></path>
</svg>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</div>
<div class="mt-10 flex space-x-3 sm:border-l sm:border-transparent sm:pl-6">
<a href={Routes.website_path(@conn, :index)} class={"inline-flex items-center rounded-md border border-transparent bg-#{@color}-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-#{@color}-700 focus:outline-none focus:ring-2 focus:ring-#{@color}-500 focus:ring-offset-2"}>Go back home</a>
<a href={Azimutt.config(:github_new_issue)} class={"inline-flex items-center rounded-md border border-transparent bg-#{@color}-100 px-4 py-2 text-sm font-medium text-#{@color}-700 hover:bg-#{@color}-200 focus:outline-none focus:ring-2 focus:ring-#{@color}-500 focus:ring-offset-2"}>Contact support</a>
<a href={Azimutt.config(:azimutt_github_issues)} class={"inline-flex items-center rounded-md border border-transparent bg-#{@color}-100 px-4 py-2 text-sm font-medium text-#{@color}-700 hover:bg-#{@color}-200 focus:outline-none focus:ring-2 focus:ring-#{@color}-500 focus:ring-offset-2"}>Contact support</a>
</div>
</div>
</main>
Expand Down
4 changes: 2 additions & 2 deletions backend/lib/azimutt_web/templates/gallery/index.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@
</h2>
<div class="mt-8 flex lg:mt-0 lg:flex-shrink-0">
<div class="inline-flex rounded-md shadow">
<a href={"#{Azimutt.config(:github_url)}/tree/main/backend/priv/static/gallery"} target="_blank" rel="noopener" class="inline-flex items-center justify-center rounded-md border border-transparent bg-indigo-600 px-5 py-3 text-base font-medium text-white hover:bg-indigo-700">Send a PR</a>
<a href={"#{Azimutt.config(:azimutt_github)}/tree/main/backend/priv/static/gallery"} target="_blank" rel="noopener" class="inline-flex items-center justify-center rounded-md border border-transparent bg-indigo-600 px-5 py-3 text-base font-medium text-white hover:bg-indigo-700">Send a PR</a>
</div>
<div class="ml-3 inline-flex rounded-md shadow">
<a href={"#{Azimutt.config(:github_new_issue)}?title=Add {{MySchema}} to Azimutt Gallery&body=Website url:%0AAzimutt project url:%0ADatabase description:%0ADatabase analysis:"} target="_blank" rel="noopener" class="inline-flex items-center justify-center rounded-md border border-transparent bg-white px-5 py-3 text-base font-medium text-indigo-600 hover:bg-indigo-50">Send an Issue</a>
<a href={"#{Azimutt.config(:azimutt_github_issues_new)}?title=Add {{MySchema}} to Azimutt Gallery&body=Website url:%0AAzimutt project url:%0ADatabase description:%0ADatabase analysis:"} target="_blank" rel="noopener" class="inline-flex items-center justify-center rounded-md border border-transparent bg-white px-5 py-3 text-base font-medium text-indigo-600 hover:bg-indigo-50">Send an Issue</a>
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<!-- Hey! Nice to meet you ❤️-->
<!-- Did you know Azimutt is an Open Source project written in Elm & Elixir? -->
<!-- You can find it here: https://github.com/azimuttapp/azimutt -->
<!-- While you are here, please take the time to give us a ⭐️. It's a great support for us. -->
<!-- You can also find us on https://twitter.com/azimuttapp or https://www.linkedin.com/company/azimuttapp -->
<!-- You can find it here: <%= Azimutt.config(:azimutt_github) %> -->
<!-- While you are here, please take the time to give us a ⭐️, it's a nice support for us. -->
<!-- You can also find us on <%= Azimutt.config(:azimutt_twitter) %> or <%= Azimutt.config(:azimutt_linkedin) %> -->
<!-- Come and say hi 👋, it keeps our motivation on top! -->
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<%= if Azimutt.config(:instance_message) do %>
<div class={"relative flex items-center justify-center gap-x-6 bg-gray-600 bg-#{Azimutt.config(:instance_message_color)}-600 px-6 py-2.5 sm:px-3.5"}>
<p class="text-sm leading-6 text-white"><%= raw(Azimutt.config(:instance_message)) %></p>
</div>
<% end %>
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<div class="fixed top-0 right-0 w-1/2 h-full bg-gray-50" aria-hidden="true"></div>
<body class="h-full font-sans antialiased bg-gray-50">
<%= render "_hello_comment.html" %>
<%= render "_instance_message.html" %>
<%= render "_email_confirm_banner.html", conn: @conn, current_user: @current_user %>
<div class="relative flex flex-col min-h-full">
<%= render "_user_navbar.html", conn: @conn, current_user: @current_user %>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<%= render "_head.html", conn: @conn %>
<body class="h-full font-sans antialiased bg-gray-100">
<%= render "_hello_comment.html" %>
<%= render "_instance_message.html" %>
<%= render "_email_confirm_banner.html", conn: @conn, current_user: @current_user %>
<div class="relative flex flex-col min-h-full">
<%= render "_user_navbar.html", conn: @conn, current_user: @current_user %>
Expand Down
Loading

0 comments on commit f31156d

Please sign in to comment.