# 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.CreateMember do alias Arke.QueryManager alias Arke.Boundary.ArkeManager use Mix.Task @shortdoc "Creates a new project" @moduledoc """ Creates a new super admin member for the given project. If no username/password are provided then a default member admin/admin will be created if no other admin exists ## Examples $ mix arke_postgres.create_member my_project my_username mypassword Is equivalent to: $ mix arke_postgres.create_member --project my_project --username my_username --password mypassword ## Options * `--project` - The id of the project where to create the member * `--username` - The username of the member * `--password` - The password of the member * `--email` - The email of the member """ @switches [ project: :string, username: :string, password: :string, email: :string ] @impl true def run(argv) do case ArkePostgres.check_env() do {:ok, _} -> [:postgrex, :ecto_sql, :arke_auth, :arke,:arke_postgres] |> Enum.each(&Application.ensure_all_started/1) case ArkePostgres.Repo.start_link() do {:ok, pid} -> parse_options(argv) Process.exit(pid, :normal) {:error, _} -> parse_options(argv) end :ok {:error, keys} -> ArkePostgres.print_missing_env(keys) end end defp parse_options(argv) do case OptionParser.parse!(argv, strict: @switches) do {[], _opts} -> Mix.Tasks.Help.run(["arke_postgres.create_member"]) {data, _opts} -> project = Keyword.fetch!(data,:project) username = Keyword.get(data,:username,"admin") password = Keyword.get(data,:password,"admin") check_user(String.to_atom(project),username,password,data) end end defp check_user(project_id,username,password,opts)do case QueryManager.get_by(project: :arke_system, arke_id: :user, username: username) do nil -> create_user(project_id,username,password,opts) %Arke.Core.Unit{}=user -> create_member(project_id,user) end end defp create_user(project_id,username,password,opts) do user_model = ArkeManager.get(:user, :arke_system) email = Keyword.get(opts,:email,"#{username}@bar.com") data = %{username: username,password: password,email: email,type: "super_admin"} with {:ok,user} <- QueryManager.create(:arke_system, user_model,data), {:ok,_member} <- create_member(project_id,user) do IO.inspect("member #{username} created",syntax_colors: [string: :cyan]) :ok else {:error,msg} -> IO.inspect(msg) :ok end end defp create_member(project_id,user) do case ArkeManager.get(:super_admin,project_id) do nil -> IO.inspect("super_admin is missing",syntax_colors: [string: :red]) :ok model -> case QueryManager.get_by(project: project_id, arke_id: :super_admin, arke_system_user: user.id) do nil -> QueryManager.create(project_id,model, arke_system_user: user.id) _ -> IO.inspect("member already exists",syntax_colors: [string: :red]) :ok end end end end