Deployment and lifecycle management for Nix
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

server: add tags to seeds

+63 -7
+1 -1
apps/sower/lib/sower/orchestration.ex
··· 333 333 334 334 """ 335 335 def list_deployments do 336 - query = from r in Deployment, order_by: [desc: r.inserted_at] 336 + query = from r in Deployment, order_by: [desc: r.deployed_at] 337 337 Repo.all(query) 338 338 end 339 339
+28 -6
apps/sower/lib/sower/seed.ex
··· 4 4 import Ecto.Changeset 5 5 import Ecto.Query, only: [from: 2] 6 6 7 - alias Sower.{Repo, Seed} 7 + alias Sower.{Repo, Seed, SeedTag} 8 + alias Ecto.Multi 8 9 9 10 @derive {Jason.Encoder, only: [:sid, :name, :seed_type, :artifact]} 10 11 ··· 20 21 field :seed_type, :string 21 22 field :artifact, :string 22 23 24 + has_many :tags, SeedTag 25 + 23 26 timestamps() 24 27 end 25 28 26 29 def create(attrs) do 27 - %Seed{ 28 - org_id: Sower.Repo.get_org_id() 29 - } 30 - |> changeset(attrs) 31 - |> Repo.insert( 30 + Multi.new() 31 + |> Multi.insert(:seed, changeset(%Seed{org_id: Sower.Repo.get_org_id()}, attrs), 32 32 on_conflict: {:replace, [:updated_at]}, 33 33 conflict_target: [:name, :seed_type, :artifact, :org_id], 34 34 returning: true 35 35 ) 36 + |> Multi.run(:tags, fn repo, %{seed: seed} -> 37 + case attrs do 38 + %{tags: tags} when is_list(tags) -> 39 + tags = 40 + Enum.map(tags, fn tag_attrs -> 41 + tag_attrs 42 + |> Map.put(:seed_id, seed.id) 43 + end) 44 + 45 + repo.insert_all(SeedTag, tags, on_conflict: :nothing) 46 + 47 + {:ok, nil} 48 + 49 + _ -> 50 + {:ok, nil} 51 + end 52 + end) 53 + |> Repo.transact() 54 + |> case do 55 + {:ok, %{seed: seed}} -> {:ok, Repo.preload(seed, :tags)} 56 + {:error, _, _, _} = error -> error 57 + end 36 58 end 37 59 38 60 def update(seed, attrs) do
+17
apps/sower/lib/sower/seed_tag.ex
··· 1 + defmodule Sower.SeedTag do 2 + use Sower.Schema 3 + import Ecto.Changeset 4 + 5 + schema "seed_tags" do 6 + field :key, :string 7 + field :value, :string 8 + 9 + belongs_to :seed, Sower.Seed 10 + end 11 + 12 + def changeset(tag, attrs) do 13 + tag 14 + |> cast(attrs, [:key, :value]) 15 + |> validate_required([:key, :value]) 16 + end 17 + end
+17
apps/sower/priv/repo/migrations/20251008020435_add_seed_tags.exs
··· 1 + defmodule Sower.Repo.Migrations.AddSeedTags do 2 + use Ecto.Migration 3 + 4 + def change do 5 + create table(:seed_tags) do 6 + add :seed_id, references(:seeds, on_delete: :delete_all), null: false 7 + add :key, :string, null: false 8 + add :value, :text, null: false 9 + end 10 + 11 + create index(:seed_tags, [:seed_id]) 12 + create index(:seed_tags, [:key]) 13 + create index(:seed_tags, [:key, :value]) 14 + create index(:seed_tags, [:value]) 15 + create unique_index(:seed_tags, [:seed_id, :key, :value]) 16 + end 17 + end