# AshUUID
[![Hex](http://img.shields.io/hexpm/v/ash_uuid.svg?style=flat)](https://hex.pm/packages/ash_uuid)
[![Hex Docs](https://img.shields.io/badge/hex-docs-purple.svg)](https://hexdocs.pm/ash_uuid)
[![Build Status](https://img.shields.io/github/actions/workflow/status/zoonect-oss/ash_uuid/ci.yml)](https://github.com/zoonect-oss/ash_uuid)
[![License](https://img.shields.io/github/license/zoonect-oss/ash_uuid?color=blue)](https://github.com/zoonect-oss/ash_uuid/blob/main/LICENSE.md)
[![GitHub Stars](https://img.shields.io/github/stars/zoonect-oss/ash_uuid?color=ffd700&label=github&logo=github)](https://github.com/zoonect-oss/ash_uuid/stargazers)
## Installation
```elixir
def deps do
[
{:ash_uuid, "~> 0.7"},
]
end
```
## Adoption
Adoption:
- add `{:ash_uuid, "~> 0.7"}`` to your `mix.exs`` project deps;
- add `AshUUID.PostgresExtension`` to your app Repo's installed_extensions and set AshUUID config `migration_default?: true` if Postgres-side UUIDs generation is needed;
- use the extension in your resources `use Ash.Resource, data_layer: AshPostgres.DataLayer, extensions: [AshUUID]`;
- simply use that for your fields `uuid_attribute :id`.
## Configuration
### `lib/myapp/repo.ex`:
Using the PostgresExtension allows postgres-side uuid-v7 generation.
```elixir
# App: Postgres migration defaults, not required
`
defmodule Myapp.Repo do
use AshPostgres.Repo, otp_app: :myapp
@impl AshPostgres.Repo
def installed_extensions do
["ash-functions", "uuid-ossp", "citext", AshUUID.PostgresExtension]
end
end
```
### `config/config.exs`:
```elixir
# AshUUID: Your otp_app name, required!
config :ash_uuid, :otp_app, :myapp
# Myapp: Customized defaults, not required
config :myapp, :ash_uuid,
version: 7, # default
encoded?: true, # default
prefixed?: true, # default
migration_default?: true, # default to false
strict?: true # default to true
# Ash: Type shorthands, not required
config :ash, :custom_types, uuid: AshUUID.UUID
# Ash: Default belongs_to type, not required
config :ash, :default_belongs_to_type, AshUUID.UUID
```
## Usage
```elixir
defmodule Pineapple do
use Ash.Resource, data_layer: AshPostgres.DataLayer, extensions: [AshUUID]
code_interface do
define_for Area
end
postgres do
table "pineapples"
repo MyApp.Repo
end
attributes do
uuid_attribute :id, prefix: "pnp"
create_timestamp :inserted_at
end
actions do
defaults [:create, :read, :update]
end
end
```
The full documentation can be found [on HexDocs].
## Roadmap
-
## Developing
To get set up with the development environment, you will need a Postgres
instance and an environment variable DATABASE_URL according to `config/config.exs`.
You may now generate and apply the test migrations:
```sh
mix ash_postgres.generate_migrations
mix ash_postgres.create
mix ash_postgres.migrate
mix test
```
**AshUUID** uses `ex_check` to bundle the test configuration, and simply running
`mix check` should closely follow the configuration used in CI.
## Contributing
If you have ideas or come across any bugs, feel free to open a [pull request] or
an [issue]. You can also find me on the [Ash Discord](https://discord.gg/D7FNG2q) as `@moissela`.
## License
MIT License
Copyright (c) 2023 [Alessio Montagnani]
See [LICENSE.md] for details.
[Alessio Montagnani]: https://github.com/moissela
[LICENSE.md]: https://github.com/zoonect-oss/ash_uuid/blob/main/LICENSE.md
[pull request]: https://github.com/zoonect-oss/ash_uuid/pulls
[issue]: https://github.com/zoonect-oss/ash_uuid/issues
[on HexDocs]: https://hexdocs.pm/ash_uuid