Created
July 11, 2024 11:37
-
-
Save zachdaniel/0b8cb27391ca37b71bf9933f465350d5 to your computer and use it in GitHub Desktop.
Ash & AshJsonApi Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Mix.install( | |
[ | |
{:ash, "~> 3.0"}, | |
{:ash_json_api, "~> 1.0"}, | |
{:plug_cowboy, "~> 2.5"}, | |
{:open_api_spex, "~> 3.16"} | |
], | |
consolidate_protocols: false | |
) | |
defmodule Accounts.Profile do | |
use Ash.Resource, | |
domain: Accounts, | |
data_layer: Ash.DataLayer.Ets, | |
extensions: [AshJsonApi.Resource] | |
json_api do | |
type "profile" | |
end | |
actions do | |
defaults [:read, :destroy, create: [:name], update: [:name]] | |
end | |
attributes do | |
uuid_primary_key :id | |
attribute :name, :string | |
end | |
end | |
defmodule Accounts do | |
use Ash.Domain, | |
extensions: [AshJsonApi.Domain], | |
validate_config_inclusion?: false # only necessary in this context because there is no config | |
json_api do | |
prefix "/api" | |
routes do | |
base_route "/profiles", Accounts.Profile do | |
index :read | |
get :read | |
post :create | |
patch :update | |
delete :destroy | |
end | |
end | |
end | |
resources do | |
resource Accounts.Profile do | |
define :all_profiles, action: :read | |
define :profile_by_id, get_by: [:id], action: :read | |
define :create_profile, args: [:name], action: :create | |
define :update_profile, args: [:name], action: :update | |
define :delete_profile, action: :destroy | |
end | |
end | |
end | |
defmodule Accounts.JsonApiRouter do | |
use AshJsonApi.Router, | |
domains: [Accounts], | |
json_schema: "/json_schema", | |
open_api: "/open_api" | |
end | |
defmodule Router do | |
use Plug.Router | |
plug(Plug.Logger) | |
plug(:match) | |
plug(:dispatch) | |
forward "/api/swaggerui", | |
to: OpenApiSpex.Plug.SwaggerUI, | |
init_opts: [ | |
path: "/api/open_api", | |
default_model_expand_depth: 4 | |
] | |
forward "/api", to: Accounts.JsonApiRouter | |
match _ do | |
send_resp(conn, 404, "not found") | |
end | |
end | |
plug_cowboy = {Plug.Cowboy, plug: Router, scheme: :http, port: 4000} | |
require Logger | |
{:ok, _} = Supervisor.start_link([plug_cowboy], strategy: :one_for_one) | |
Logger.info("Server started at http://localhost:4000") | |
unless IEx.started?() do | |
Process.sleep(:infinity) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi Zach, I'm new to Elixir and find the Ash framework you build very interesting!
I tried downloading and running this file, but it seems to not compile with elixir 1.18.4 because of an issue with
open_api_spex
dependency.Just wanted to let you know in case you want fix it so newcomers like me can try it out :)