Phase 1 - Database foundation: - Categories, businesses, hours, photos migrations - Ecto schemas with changesets and validations Phase 2 - Business logic: - Logic module with pure functions (Haversine distance, slug generation, etc.) - Queries module for database operations with filtering - Businesses context coordinating Logic and Queries layers - 43 tests covering logic and queries 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
40 lines
1.2 KiB
Elixir
40 lines
1.2 KiB
Elixir
defmodule Localspot.Repo.Migrations.CreateBusinesses do
|
|
use Ecto.Migration
|
|
|
|
def change do
|
|
create table(:businesses) do
|
|
add :name, :string, null: false
|
|
add :slug, :string, null: false
|
|
add :description, :text
|
|
add :phone, :string
|
|
add :email, :string
|
|
add :website, :string
|
|
|
|
# Address fields
|
|
add :street_address, :string, null: false
|
|
add :city, :string, null: false
|
|
add :state, :string, null: false
|
|
add :zip_code, :string, null: false
|
|
|
|
# Location for radius search (Haversine)
|
|
add :latitude, :decimal, precision: 10, scale: 8
|
|
add :longitude, :decimal, precision: 11, scale: 8
|
|
|
|
# Local ownership
|
|
add :locally_owned, :boolean, default: true, null: false
|
|
|
|
# Status
|
|
add :active, :boolean, default: true, null: false
|
|
|
|
add :category_id, references(:categories, on_delete: :restrict), null: false
|
|
|
|
timestamps(type: :utc_datetime)
|
|
end
|
|
|
|
create unique_index(:businesses, [:slug])
|
|
create index(:businesses, [:category_id])
|
|
create index(:businesses, [:latitude, :longitude])
|
|
create index(:businesses, [:city, :state])
|
|
create index(:businesses, [:active])
|
|
end
|
|
end
|