# 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.CreateProject do
alias Arke.QueryManager
alias Arke.Boundary.ArkeManager
use Mix.Task
@shortdoc "Creates a new project"
@moduledoc """
Creates a new project in the database.
## Examples
$ mix arke_postgres.create_project --id my_project
$ mix arke_postgres.create_project --id my_project --description "My project description"
## Command line options
* `--id` - The id of the project to create
* `--label` - The label of the project to create
* `--description` - The description of the project to create
"""
@impl true
def run([]) do
Mix.shell().error(
"Project ID is missing. Please provide an id for the project by passing --id project_id"
)
end
def run(args) do
case ArkePostgres.check_env() do
{:ok, _} ->
[:postgrex, :ecto_sql]
|> Enum.each(&Application.ensure_all_started/1)
case ArkePostgres.Repo.start_link() do
{:ok, pid} ->
args |> parse_args() |> create_project()
Process.exit(pid, :normal)
:ok
{:error, _} ->
args |> parse_args() |> create_project()
:ok
end
{:error, keys} ->
ArkePostgres.print_missing_env(keys)
end
end
defp create_project([{:id, id} | _] = opts) do
Mix.shell().info("--- Creating schema for #{id}--- ")
ArkePostgres.create_project(%{arke_id: :arke_project, id: id})
Mix.shell().info("--- Creating arke_project for #{id}--- ")
label = opts[:label] || String.capitalize(id) |> String.replace("_"," ") |> String.trim
description = opts[:description] || "Arke for the schema #{id}"
now = Arke.Utils.DatetimeHandler.now(:datetime)
data = %{label: %{value: label, datetime: now },
description: %{value: description, datetime: now } ,
type: %{value: "postgres_schema", datetime: now },
persistence: %{value: "arke_parameter", datetime: now }}
row = [
id: id,
arke_id: "arke_project",
data: data,
metadata: %{},
inserted_at: now,
updated_at: now
]
case ArkePostgres.Repo.insert(ArkePostgres.Tables.ArkeUnit.changeset(Enum.into(row, %{})),
prefix: "arke_system"
) do
{:ok, record} ->
{:ok, record}
{:error, changeset} ->
{:error, changeset.errors}
end
end
defp create_project(_) do
Mix.shell().error(
"Project ID is missing. Please provide an id for the project by passing --id project_id"
)
end
defp parse_args(args) do
{options, _} =
OptionParser.parse!(args, strict: [id: :string, label: :string, description: :string])
options
end
end