# Elixir Utilities
This repository contains several utility modules for use with Elixir, particularly focused on Ecto and Plug-based applications. Below are detailed explanations and examples for each module.
## Modules
1. [Jsonb](#jsonb)
2. [Schema](#schema)
3. [Router](#router)
4. [Responses](#responses)
5. [Provider](#provider)
---
## Jsonb
A module for building Ecto queries with JSONB columns.
#### Example
```elixir
import Ecto.Query
query = from(p in Post)
json_query(query, :metadata, [title: "Elixir", author: "José"], where_type: :where)
# Ecto query with JSONB where clauses
```
---
##Schema
A module for defining common Ecto schema configurations.
#### Example
```elixir
defmodule MySchema do
use Schema
schema "my_table" do
field :name, :string
# additional fields
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:name])
|> validate_required([:name])
end
end
```
## Router
A module for defining common Plug router configurations.
#### Example
```elixir
defmodule MyRouter do
use Router
plug :match
plug :dispatch
get "/" do
send_resp(conn, 200, "Welcome")
end
match _ do
send_resp(conn, 404, "Not Found")
end
end
```
## Responses
A module providing wrappers for common HTTP responses in Plug applications.
#### Example
```elixir
# Sending a JSON response
conn |> json(:ok, %{hello: "World"})
conn |> json(:ok, %{hello: "World"}, resp_headers: %{"x-foo" => "bar"})
# Sending an HTML response
conn |> html(:ok, "<h1>Hello World</h1>")
conn |> html(:ok, "<h1>Hello World</h1>", resp_headers: %{"x-foo" => "bar"})
# Sending a text response
conn |> text(:ok, "Hello World!")
conn |> text(:ok, "Hello World!", resp_headers: %{"x-foo" => "bar"})
# Sending a file response
conn |> file(:ok, "/path/to/file")
conn |> file(:ok, "/path/to/file", resp_headers: %{"x-foo" => "bar"})
# Sending a file download response
conn |> download(:ok, "/path/to/file")
conn |> download(:ok, "/path/to/file", resp_headers: %{"x-foo" => "bar"})
# Sending a status-only response
conn |> status(:ok)
# Redirecting the request
conn |> redirect("http://example.com/")
conn |> redirect(301, "http://example.com/")
# Converting string keys in params to atoms
changeset_params(%{"name" => "John"})
# => %{name: "John"}
# Parsing errors from an Ecto changeset or a given error map/string
parse_errors(%Ecto.Changeset{errors: [name: {"can't be blank", []}]})
# => %{name: "can't be blank"}
parse_errors("An error occurred")
# => %{error: "An error occurred"}
```
## Provider
A module for setting up common Ecto query imports and basic CRUD operations.
#### Example
```elixir
defmodule MyRepo do
use Provider
alias MyApp.Repo
def get_all_users do
get(User)
end
def create_user(attrs) do
insert(%User{}, attrs)
end
def update_user(user, attrs) do
update(user, attrs)
end
def delete_user(user) do
delete(user)
end
end
```
## License
This project is licensed under the MIT License.