diff options
| author | Dawid Rycerz <dawid@rycerz.xyz> | 2025-03-23 17:11:39 +0100 |
|---|---|---|
| committer | Dawid Rycerz <dawid@rycerz.xyz> | 2025-04-05 21:16:51 +0200 |
| commit | 0ab2e5ba2b0631b28b5b1405559237b3913c878f (patch) | |
| tree | 791cea788b0a62bc483d0041fbd0c655d2ad49e8 /lib/silmataivas/release.ex | |
feat: initialize Phoenix application for weather alerts
This commit sets up the initial Silmataivas project structure, including: Phoenix web framework configuration, database models for users and locations, weather polling service, notification system, Docker and deployment configurations, CI/CD pipeline setup
Diffstat (limited to 'lib/silmataivas/release.ex')
| -rw-r--r-- | lib/silmataivas/release.ex | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/lib/silmataivas/release.ex b/lib/silmataivas/release.ex new file mode 100644 index 0000000..4fc9e93 --- /dev/null +++ b/lib/silmataivas/release.ex @@ -0,0 +1,136 @@ +defmodule Silmataivas.Release do + @moduledoc """ + Release tasks for Silmataivas application. + + This module provides functions to run Ecto migrations in a + compiled release, supporting both SQLite and PostgreSQL backends. + """ + + @app :silmataivas + + @doc """ + Creates a new user with optional user ID and role. + + ## Parameters + * `user_id` - An optional user ID to use. If not provided, a UUID will be generated. + * `role` - An optional role, must be either "user" or "admin". Defaults to "user". + + ## Examples + Silmataivas.Release.new_user() + Silmataivas.Release.new_user("custom_user_id") + Silmataivas.Release.new_user("custom_user_id", "admin") + """ + def new_user(user_id \\ nil, role \\ "user") do + # Create the new user + load_app() + start_repos() + + # Validate role + unless role in ["user", "admin"] do + IO.puts("\n❌ Invalid role: #{role}. Role must be either \"user\" or \"admin\".") + exit({:shutdown, 1}) + end + + user_id = user_id || Ecto.UUID.generate() + user_params = %{user_id: user_id, role: role} + + case Silmataivas.Users.create_user(user_params) do + {:ok, user} -> + IO.puts("\n✅ User created successfully!") + IO.puts(" User ID (API token): #{user.user_id}") + IO.puts(" Role: #{user.role}") + + {:error, changeset} -> + IO.puts("\n❌ Failed to create user:") + IO.inspect(changeset.errors) + end + end + + def migrate do + load_app() + + for repo <- repos() do + {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true)) + end + end + + def rollback(repo, version) do + load_app() + + {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :down, to: version)) + end + + def create_db do + load_app() + + for repo <- repos() do + # Create the database if it doesn't exist + adapter = get_repo_adapter(repo) + + case adapter.storage_up(repo.config()) do + :ok -> + IO.puts("Database for #{inspect(repo)} created successfully") + + {:error, :already_up} -> + IO.puts("Database for #{inspect(repo)} already exists") + + {:error, reason} -> + IO.warn("Database for #{inspect(repo)} failed to create: #{inspect(reason)}") + end + end + end + + def setup do + # Create the database and then run migrations + create_db() + migrate() + end + + def db_info do + load_app() + + for repo <- repos() do + adapter = get_repo_adapter(repo) + config = repo.config() + + IO.puts("Repository: #{inspect(repo)}") + IO.puts("Adapter: #{inspect(adapter)}") + + case adapter do + Ecto.Adapters.SQLite3 -> + db_path = config[:database] || "default.db" + IO.puts("Database path: #{db_path}") + + Ecto.Adapters.Postgres -> + hostname = config[:hostname] || "localhost" + database = config[:database] || "default" + IO.puts("Host: #{hostname}, Database: #{database}") + + _ -> + IO.puts("Config: #{inspect(config)}") + end + + IO.puts("---") + end + end + + defp get_repo_adapter(repo) do + repo.config()[:adapter] + end + + defp start_repos do + {:ok, _} = Application.ensure_all_started(:ecto_sql) + + for repo <- repos() do + {:ok, _} = repo.start_link(pool_size: 2) + end + end + + defp repos do + Application.fetch_env!(@app, :ecto_repos) + end + + defp load_app do + Application.load(@app) + end +end |
