View Source MyApp.CharonOauth2.Clients (CharonOauth2 v0.5.1)

Context to manage clients

Summary

Functions

Get a list of all oauth2 clients.

Delete a client.

Get a single client by one or more clauses, optionally with preloads. Returns nil if Client cannot be found.

Insert a new client.

Update a client.

Functions

all(filters \\ %{}, preloads \\ [])

@spec all(%{required(atom()) => any()}, [MyApp.CharonOauth2.Client.resolvable()]) :: [
  MyApp.CharonOauth2.Client.t()
]

Get a list of all oauth2 clients.

Doctests

iex> client = insert_test_client!(owner_id: insert_test_user().id)
iex> [^client] = Clients.all()

# can be filtered
iex> client = insert_test_client!(owner_id: insert_test_user().id)
iex> [^client] = Clients.all(%{owner_id: client.owner_id})
iex> [^client] = Clients.all(%{grant_types: "authorization_code"})
iex> [] = Clients.all(%{owner_id: client.owner_id + 1})

delete(client)

@spec delete(MyApp.CharonOauth2.Client.t() | keyword() | map()) ::
  {:ok, MyApp.CharonOauth2.Client.t()} | {:error, :not_found}

Delete a client.

Examples / doctests

# client must exist
iex> {:error, :not_found} = Clients.delete(id: Ecto.UUID.generate())

# succesfully deletes a client
iex> client = insert_test_client!(owner_id: insert_test_user().id)
iex> {:ok, _} = Clients.delete([id: client.id])
iex> {:error, :not_found} = Clients.delete([id: client.id])

get_by(clauses, preloads \\ [])

Get a single client by one or more clauses, optionally with preloads. Returns nil if Client cannot be found.

Doctests

iex> client = insert_test_client!(owner_id: insert_test_user().id)
iex> %Client{} = Clients.get_by(id: client.id)
iex> nil = Clients.get_by(id: Ecto.UUID.generate())

# preloads things
iex> client = insert_test_client!(owner_id: insert_test_user().id)
iex> auth = insert_test_authorization!(resource_owner_id: insert_test_user().id, client_id: client.id)
iex> insert_test_grant!(authorization_id: auth.id)
iex> %{owner: %{id: _}, authorizations: [_]} = Clients.get_by([id: client.id], Client.supported_preloads)

insert(params)

@spec insert(map()) ::
  {:ok, MyApp.CharonOauth2.Client.t()} | {:error, Ecto.Changeset.t()}

Insert a new client.

Examples / doctests

# succesfully creates a client with a secret
iex> user = insert_test_user()
iex> {:ok, client} = insert_test_client(owner_id: user.id)
iex> %{secret: <<_::binary>>} = client

# owner must exist
iex> insert_test_client(owner_id: -1) |> errors_on()
%{owner: ["does not exist"]}

iex> Clients.insert(%{}) |> errors_on()
%{grant_types: ["can't be blank"], name: ["can't be blank"], owner_id: ["can't be blank"], redirect_uris: ["can't be blank"], scope: ["can't be blank"]}

update(client, params)

@spec update(MyApp.CharonOauth2.Client.t() | keyword() | map(), map()) ::
  {:ok, MyApp.CharonOauth2.Client.t()}
  | {:error, Ecto.Changeset.t()}
  | {:error, :not_found}

Update a client.

Examples / doctests

iex> client = insert_test_client!(owner_id: insert_test_user().id)
iex> {:ok, updated} = Clients.update(client, %{secret: "new!"})
iex> false = updated.secret == client.secret

# secret is randomly generated on update
iex> client = insert_test_client!(owner_id: insert_test_user().id)
iex> {:ok, updated} = Clients.update([id: client.id], %{secret: "new!"})
iex> false = updated.secret == client.secret
iex> false = updated.secret == "new!"

# scopes must be subset of configured scopes
iex> client = insert_test_client!(owner_id: insert_test_user().id)
iex> Clients.update([id: client.id], %{scope: ~w(cry)}) |> errors_on()
%{scope: ["must be subset of party, read, write"]}

# underlying authrorization scopes are reduced to client's reduced scopes
iex> client = insert_test_client!(owner_id: insert_test_user().id, scope: ~w(read write))
iex> authorization = insert_test_authorization!(resource_owner_id: insert_test_user().id, client_id: client.id, scope: ~w(read write))
iex> {:ok, _} = Clients.update([id: client.id], %{scope: ~w(read)})
iex> %{scope: ~w(read)} = Authorizations.get_by(id: authorization.id)

# id and owner id can't be updated
iex> %{id: id, owner_id: owner_id} = insert_test_client!(owner_id: insert_test_user().id)
iex> {:ok, %{id: ^id, owner_id: ^owner_id}} = Clients.update([id: id], %{id: Ecto.UUID.generate(), owner_id: -1})