<!--
This file was generated by Spark. Do not edit it by hand.
-->
# AshMultiAccount.LinkedAccount
An Ash extension which generates the default linked account resource.
The linked account resource tracks links between user accounts within a
browser session. Each link connects a "primary user" (the account that
initiated the session) with a "linked user" (an additional account), scoped
to a session token.
## Usage
There is no need to define attributes, relationships, or actions manually.
The extension generates them all for you.
```elixir
defmodule MyApp.Accounts.LinkedAccount do
use Ash.Resource,
domain: MyApp.Accounts,
data_layer: ..., # any Ash data layer (AshPostgres, AshSqlite, ETS, etc.)
extensions: [AshMultiAccount.LinkedAccount]
multi_account do
user_resource MyApp.Accounts.User
end
end
```
If using a database-backed data layer, add the appropriate data layer config
(e.g. `postgres do ... end` for AshPostgres).
## Generated Schema
The extension adds:
- **Primary Key**: `id` (UUID, auto-generated if not already defined)
- **Attributes**: `session_token` (UUID), `status` (`:active` / `:inactive`),
`inserted_at`, `updated_at`
- **Relationships**: `primary_user` and `linked_user` (both `belongs_to` User)
- **Identity**: unique constraint on `[primary_user_id, linked_user_id, session_token]`
- **Actions**: `create_linked_account`, `get_linked_accounts`, `activate`,
`deactivate`, `read`, `destroy`
- **Calculation**: `is_active?` (module-based, checks status attribute)
## Policies
No policies are added by default. You should add your own authorization
policies. Recommended:
```elixir
policies do
policy action_type(:read) do
authorize_if always()
end
policy action_type(:create) do
authorize_if relates_to_actor_via(:primary_user)
end
policy action_type([:update, :destroy]) do
authorize_if expr(primary_user_id == ^actor(:id))
end
end
```
## multi_account
Configure multi-account options for the LinkedAccount resource.
### Options
| Name | Type | Default | Docs |
|------|------|---------|------|
| [`user_resource`](#multi_account-user_resource){: #multi_account-user_resource .spark-required} | `module` | | The User resource module that linked accounts belong to. |
| [`session_token_attribute_name`](#multi_account-session_token_attribute_name){: #multi_account-session_token_attribute_name } | `atom` | `:session_token` | The name of the session token attribute. |
| [`status_attribute_name`](#multi_account-status_attribute_name){: #multi_account-status_attribute_name } | `atom` | `:status` | The name of the status attribute. |
| [`primary_user_relationship_name`](#multi_account-primary_user_relationship_name){: #multi_account-primary_user_relationship_name } | `atom` | `:primary_user` | The name of the primary_user belongs_to relationship. |
| [`linked_user_relationship_name`](#multi_account-linked_user_relationship_name){: #multi_account-linked_user_relationship_name } | `atom` | `:linked_user` | The name of the linked_user belongs_to relationship. |
| [`create_action_name`](#multi_account-create_action_name){: #multi_account-create_action_name } | `atom` | `:create_linked_account` | The name of the create linked account action. |
| [`get_linked_accounts_action_name`](#multi_account-get_linked_accounts_action_name){: #multi_account-get_linked_accounts_action_name } | `atom` | `:get_linked_accounts` | The name of the get linked accounts read action. |
| [`activate_action_name`](#multi_account-activate_action_name){: #multi_account-activate_action_name } | `atom` | `:activate` | The name of the activate action. |
| [`deactivate_action_name`](#multi_account-deactivate_action_name){: #multi_account-deactivate_action_name } | `atom` | `:deactivate` | The name of the deactivate action. |
| [`read_action_name`](#multi_account-read_action_name){: #multi_account-read_action_name } | `atom` | `:read` | The name of the default read action. |
| [`destroy_action_name`](#multi_account-destroy_action_name){: #multi_account-destroy_action_name } | `atom` | `:destroy` | The name of the default destroy action. |
<style type="text/css">.spark-required::after { content: "*"; color: red !important; }</style>