Skip to content

Alex porter #117

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
124 changes: 124 additions & 0 deletions elixir/lib/homework/companies.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
defmodule Homework.Companies do
@moduledoc """
The Companies context
"""

import Ecto.Query, warn: false
alias Homework.Repo

alias Homework.Companies.Company

@doc """
Returns a list of companies

## Examples

iex> list_companies([])
[%Company{}, ...]
"""
def list_companies(_args) do
Repo.all(Company)
end

@doc """
Gets a single company

Raises 'Ecto.NoResultsError' if the Company does not exist.any()

## Examples

iex> get_company!(123)
%Company{}

iex> get_company!(456)
** (Ecto.NoResultsError)
"""
def get_company!(id), do: Repo.get!(Company, id)

@doc """
Gets a company by name.

## Example

iex> get_company_by_name("Divvy")
%Company{}

iex> get_company_by_name("X")
%[]

"""

def get_company_by_name(name) do
Repo.all(
from(c in Company,
where: ilike(c.name, ^"%#{name}%")
)
)
end

@doc """
Creates a company

## Examples

iex> create_company(%{field: value})
{:ok, %Company{}}

iex> create_company(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_company(attrs \\ %{}) do
%Company{}
|> Company.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a company.

## Examples

iex> update_company(company, %{field: new_value})
{:ok, %User{}}

iex> update_company(company, %{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def update_company(%Company{} = company, attrs) do
company
|> Company.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a company.

## Examples

iex> delete_company(company)
{:ok, %Company{}}

iex> delete_company(company)
{:error, %Ecto.Changeset{}}

"""
def delete_company(%Company{} = company) do
Repo.delete(company)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking company changes.

## Examples

iex> change_company(company)
%Ecto.Changeset{data: %Company{}}

"""
def change_company(%Company{} = company, attrs \\ %{}) do
Company.changeset(company, attrs)
end


end
21 changes: 21 additions & 0 deletions elixir/lib/homework/companies/company.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
defmodule Homework.Companies.Company do
use Ecto.Schema
import Ecto.Changeset

@primary_key {:id, :binary_id, autogenerate: true}
schema "companies" do
field(:name, :string)
field(:credit_line, :integer)
field(:available_credit, :integer)

timestamps()
end

@doc false
def changeset(company, attrs) do
company
|> cast(attrs, [:name, :available_credit, :credit_line])
|> validate_required([:name, :available_credit, :credit_line])
end

end
22 changes: 22 additions & 0 deletions elixir/lib/homework/merchants.ex
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,28 @@ defmodule Homework.Merchants do
"""
def get_merchant!(id), do: Repo.get!(Merchant, id)


@doc """
Gets a merchant by name.

## Example

iex> get_merchant_by_name("Divvy")
%Merchant{}

iex> get_merchant_by_name("X")
%[]

"""

def get_merchant_by_name(name) do
Repo.all(
from(m in Merchant,
where: ilike(m.name, ^"%#{name}%")
)
)
end

@doc """
Creates a merchant.

Expand Down
48 changes: 45 additions & 3 deletions elixir/lib/homework/transactions.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ defmodule Homework.Transactions do
alias Homework.Repo

alias Homework.Transactions.Transaction
alias Homework.Companies.Company

@doc """
Returns the list of transactions.
Expand Down Expand Up @@ -37,6 +38,26 @@ defmodule Homework.Transactions do
"""
def get_transaction!(id), do: Repo.get!(Transaction, id)

@doc """
Searches transactions and filters by amount.

#Examples

iex> filter_transaction(minimum: 100, maximum: 500)
%Transactions{}

iex> filter_transaction(minimum: 0, maximum: 0)
%[]
"""

def filter_transaction(minimum, maximum) do
Repo.all(
from(t in Transaction,
where: t.amount >= ^minimum and t.amount <= ^maximum
)
)
end

@doc """
Creates a transaction.

Expand All @@ -50,9 +71,30 @@ defmodule Homework.Transactions do

"""
def create_transaction(attrs \\ %{}) do
%Transaction{}
|> Transaction.changeset(attrs)
|> Repo.insert()
transaction =
%Transaction{}
|> Transaction.changeset(attrs)

case Repo.insert(transaction) do
{:ok, transaction} ->
update_company_credit(transaction)
{:ok, transaction}

{:error, changeset} ->
{:error, changeset}
end
end

@doc """
Updates a companies available_credit each time a new transaction is created
assoicated with the company_id.
"""

def update_company_credit(transaction) do
company = Repo.get!(Company, transaction.company_id)
new_available_credit = company.available_credit - transaction.amount
result = Company.changeset(company, %{available_credit: new_available_credit})
Repo.update(result)
end

@doc """
Expand Down
6 changes: 4 additions & 2 deletions elixir/lib/homework/transactions/transaction.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ defmodule Homework.Transactions.Transaction do
import Ecto.Changeset
alias Homework.Merchants.Merchant
alias Homework.Users.User
alias Homework.Companies.Company

@primary_key {:id, :binary_id, autogenerate: true}
schema "transactions" do
Expand All @@ -13,14 +14,15 @@ defmodule Homework.Transactions.Transaction do

belongs_to(:merchant, Merchant, type: :binary_id, foreign_key: :merchant_id)
belongs_to(:user, User, type: :binary_id, foreign_key: :user_id)
belongs_to(:company, Company, type: :binary_id, foreign_key: :company_id)

timestamps()
end

@doc false
def changeset(transaction, attrs) do
transaction
|> cast(attrs, [:user_id, :amount, :debit, :description, :merchant_id])
|> validate_required([:user_id, :amount, :debit, :description, :merchant_id])
|> cast(attrs, [:user_id, :amount, :debit, :credit, :description, :merchant_id, :company_id])
|> validate_required([:user_id, :amount, :debit, :credit, :description, :merchant_id, :company_id])
end
end
18 changes: 18 additions & 0 deletions elixir/lib/homework/users.ex
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,24 @@ defmodule Homework.Users do
"""
def get_user!(id), do: Repo.get!(User, id)

@doc """
Gets a user by first and last name.

## Examples

iex> get_by_name("Alex", "Porter")
%User{}

"""

def get_user_by_name(first_name, last_name) do
Repo.all(
from(u in User,
where: ilike(u.first_name, ^"%#{first_name}%") and ilike(u.last_name, ^"%#{last_name}%")
)
)
end

@doc """
Creates a user.

Expand Down
11 changes: 9 additions & 2 deletions elixir/lib/homework/users/user.ex
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
defmodule Homework.Users.User do
use Ecto.Schema
import Ecto.Changeset
alias Homework.Companies.Company

@primary_key {:id, :binary_id, autogenerate: true}
schema "users" do
field(:dob, :string)
field(:first_name, :string)
field(:last_name, :string)

belongs_to(:company, Company, type: :binary_id, foreign_key: :company_id)

timestamps()
end

@doc false
def changeset(user, attrs) do
user
|> cast(attrs, [:first_name, :last_name, :dob])
|> validate_required([:first_name, :last_name, :dob])
|> cast(attrs, [:first_name, :last_name, :dob, :company_id])
|> validate_required([:first_name, :last_name, :dob, :company_id])
|> foreign_key_constraint(:company,
name: :users_company_id_fkey,
message: "Company_ID does not exist, make sure you are entering a valid ID"
)
end
end
72 changes: 72 additions & 0 deletions elixir/lib/homework_web/resolvers/companies_resolver.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
defmodule HomeworkWeb.Resolvers.CompaniesResolver do

alias Homework.Companies

@doc """
Get a list of companies
"""
def companies(_root, args, _info) do
{:ok, Companies.list_companies(args)}
end

@doc """
Create a new company
"""

def create_company(_root, args, _info) do
case Companies.create_company(args) do
{:ok, company} ->
{:ok, company}

error ->
{:error, "could not create company: #{inspect(error)}"}
end
end

@doc """
Searches for companies by name.

Returns the matching companies, if found.
Otherwise results in an empty list.
"""

def search_company(_root, %{name: name}, _info) do
companies = Companies.get_company_by_name(name)

if length(companies) > 0 do
{:ok, companies}
else
{:ok, []}
end
end

@doc """
Updates a company for an id with args specified.
"""
def update_company(_root, %{id: id} = args, _info) do
company = Companies.get_company!(id)

case Companies.update_company(company, args) do
{:ok, company} ->
{:ok, company}

error ->
{:error, "could not update company: #{inspect(error)}"}
end
end

@doc """
Deletes a company for an id
"""
def delete_company(_root, %{id: id}, _info) do
company = Companies.get_company!(id)

case Companies.delete_company(company) do
{:ok, company} ->
{:ok, company}

error ->
{:error, "could not update company: #{inspect(error)}"}
end
end
end
Loading