# Copyright 2023 Arkemis S.r.l.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
defmodule Mix.Tasks.ArkePostgres.InitDb do
alias Arke.QueryManager
alias Arke.Boundary.ArkeManager
use Mix.Task
@shortdoc "Init new arke postgres DB"
@switches [
quiet: :boolean,
username: :string,
password: :string
]
@aliases [
q: :quiet,
u: :username,
pwd: :password
]
@moduledoc """
Create the essentials so you can start using arke.
The essentials are created in the db specified under
`:arke_postgres` option in the current app configuration.
## Examples
$ mix arke_postgres.init_db
## Command line options
* `--quiet` - do not log output
* `--username` - do not create default_user
* `--password` - do not create default_user
"""
@impl true
def run(args) do
{opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
case ArkePostgres.check_env() do
{:ok, _} ->
[:postgrex, :ecto_sql, :arke_auth, :arke]
|> Enum.each(&Application.ensure_all_started/1)
case ArkePostgres.Repo.start_link() do
{:ok, pid} ->
create_default(opts)
Process.exit(pid, :normal)
{:error, _} ->
create_default(opts)
end
:ok
{:error, keys} ->
ArkePostgres.print_missing_env(keys)
end
end
defp create_default(opts) do
unless opts[:quiet] do
print_message("---- Creating schema ----")
end
ArkePostgres.create_project(%{arke_id: :arke_project, id: :arke_system})
unless opts[:quiet] do
print_message("---- Schema created ----")
print_message("---- Creating arke_system project ----")
end
create_base_project()
unless opts[:quiet] do
print_message("---- Project created ----")
end
unless is_nil(opts[:username]) and is_nil(opts[:password]) do
unless opts[:quiet] do
print_message("---- Creating user #{opts[:username]} ----")
end
create_admin_user(opts[:username], opts[:password])
unless opts[:quiet] do
print_message("---- User created ----")
end
end
unless opts[:quiet] do
print_message("---- Creating default user ----")
end
create_admin_user("admin", "admin")
unless opts[:quiet] do
print_message("---- Default user created ----")
end
end
defp print_message(msg) do
Mix.shell().info(msg)
end
defp create_base_project() do
arke_project = ArkeManager.get(:arke_project, :arke_system)
QueryManager.create(:arke_system, arke_project,
id: :arke_system,
label: "Arke system",
description: "Base project of the application",
type: "postgres_schema"
)
end
defp create_admin_user(username, password) do
user_arke = ArkeManager.get(:user, :arke_system)
QueryManager.create(:arke_system, user_arke, %{
username: username,
password: password,
type: "super_admin"
})
end
end