Deployment and lifecycle management for Nix
0
fork

Configure Feed

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

fix(server): drop branch from unique index, delete dups on migration

+188 -3
+1 -1
lib/sower/seed.ex
··· 119 119 end 120 120 121 121 identities do 122 - identity :seed, [:name, :seed_type, :out_path, :branch] 122 + identity :seed, [:name, :seed_type, :out_path] 123 123 end 124 124 125 125 json_api do
+44
priv/repo/migrations/20240726204408_fix_seeds_unique_index.exs
··· 1 + defmodule Sower.Repo.Migrations.FixSeedsUniqueIndex do 2 + @moduledoc """ 3 + Updates resources based on their most recent snapshots. 4 + 5 + This file was autogenerated with `mix ash_postgres.generate_migrations` 6 + """ 7 + 8 + use Ecto.Migration 9 + 10 + import Ecto.Query 11 + 12 + def up do 13 + drop_if_exists unique_index(:seeds, [:name, :seed_type, :out_path, :branch], 14 + name: "seeds_seed_index" 15 + ) 16 + 17 + delete_duplicate_seeds() 18 + 19 + create unique_index(:seeds, [:name, :seed_type, :out_path], name: "seeds_seed_index") 20 + end 21 + 22 + def down do 23 + drop_if_exists unique_index(:seeds, [:name, :seed_type, :out_path], name: "seeds_seed_index") 24 + 25 + create unique_index(:seeds, [:name, :seed_type, :out_path, :branch], name: "seeds_seed_index") 26 + end 27 + 28 + def delete_duplicate_seeds() do 29 + query = 30 + from s in "seeds", 31 + select: %{id: s.id, rn: over(row_number(), :dup_seeds)}, 32 + windows: [ 33 + dup_seeds: [partition_by: [s.name, s.seed_type, s.out_path], order_by: s.inserted_at] 34 + ] 35 + 36 + query = 37 + from s in subquery(query), select: s.id, where: s.rn > 1 38 + 39 + query = 40 + from s in Sower.Seed, where: s.id in subquery(query) 41 + 42 + query |> Sower.Repo.delete_all() 43 + end 44 + end
+2 -2
priv/resource_snapshots/repo/extensions.json
··· 1 1 { 2 + "ash_functions_version": 4, 2 3 "installed": [ 3 4 "ash-functions", 4 5 "citext", 5 6 "uuid-ossp" 6 - ], 7 - "ash_functions_version": 3 7 + ] 8 8 }
+141
priv/resource_snapshots/repo/seeds/20240726204408.json
··· 1 + { 2 + "attributes": [ 3 + { 4 + "allow_nil?": false, 5 + "default": "fragment(\"gen_random_uuid()\")", 6 + "generated?": false, 7 + "primary_key?": true, 8 + "references": null, 9 + "size": null, 10 + "source": "id", 11 + "type": "uuid" 12 + }, 13 + { 14 + "allow_nil?": false, 15 + "default": "fragment(\"(now() AT TIME ZONE 'utc')\")", 16 + "generated?": false, 17 + "primary_key?": false, 18 + "references": null, 19 + "size": null, 20 + "source": "inserted_at", 21 + "type": "utc_datetime_usec" 22 + }, 23 + { 24 + "allow_nil?": false, 25 + "default": "fragment(\"(now() AT TIME ZONE 'utc')\")", 26 + "generated?": false, 27 + "primary_key?": false, 28 + "references": null, 29 + "size": null, 30 + "source": "updated_at", 31 + "type": "utc_datetime_usec" 32 + }, 33 + { 34 + "allow_nil?": true, 35 + "default": "nil", 36 + "generated?": false, 37 + "primary_key?": false, 38 + "references": null, 39 + "size": null, 40 + "source": "branch", 41 + "type": "text" 42 + }, 43 + { 44 + "allow_nil?": false, 45 + "default": "nil", 46 + "generated?": false, 47 + "primary_key?": false, 48 + "references": null, 49 + "size": null, 50 + "source": "name", 51 + "type": "text" 52 + }, 53 + { 54 + "allow_nil?": false, 55 + "default": "nil", 56 + "generated?": false, 57 + "primary_key?": false, 58 + "references": null, 59 + "size": null, 60 + "source": "seed_type", 61 + "type": "text" 62 + }, 63 + { 64 + "allow_nil?": false, 65 + "default": "nil", 66 + "generated?": false, 67 + "primary_key?": false, 68 + "references": null, 69 + "size": null, 70 + "source": "out_path", 71 + "type": "text" 72 + }, 73 + { 74 + "allow_nil?": true, 75 + "default": "nil", 76 + "generated?": false, 77 + "primary_key?": false, 78 + "references": { 79 + "deferrable": false, 80 + "destination_attribute": "id", 81 + "destination_attribute_default": null, 82 + "destination_attribute_generated": null, 83 + "index?": false, 84 + "match_type": null, 85 + "match_with": null, 86 + "multitenancy": { 87 + "attribute": null, 88 + "global": null, 89 + "strategy": null 90 + }, 91 + "name": "seeds_repository_id_fkey", 92 + "on_delete": "delete", 93 + "on_update": null, 94 + "primary_key?": true, 95 + "schema": null, 96 + "table": "input_repositories" 97 + }, 98 + "size": null, 99 + "source": "repository_id", 100 + "type": "uuid" 101 + } 102 + ], 103 + "base_filter": null, 104 + "check_constraints": [], 105 + "custom_indexes": [], 106 + "custom_statements": [], 107 + "has_create_action": true, 108 + "hash": "7E7EDEDF0A35D278FF1AD555E5A37EE676FE292BDD293E6A376E9AD7833B1E1F", 109 + "identities": [ 110 + { 111 + "all_tenants?": false, 112 + "base_filter": null, 113 + "index_name": "seeds_seed_index", 114 + "keys": [ 115 + { 116 + "type": "atom", 117 + "value": "name" 118 + }, 119 + { 120 + "type": "atom", 121 + "value": "seed_type" 122 + }, 123 + { 124 + "type": "atom", 125 + "value": "out_path" 126 + } 127 + ], 128 + "name": "seed", 129 + "nils_distinct?": true, 130 + "where": null 131 + } 132 + ], 133 + "multitenancy": { 134 + "attribute": null, 135 + "global": null, 136 + "strategy": null 137 + }, 138 + "repo": "Elixir.Sower.Repo", 139 + "schema": null, 140 + "table": "seeds" 141 + }