An open API service indexing awesome lists of open source software.

https://github.com/librity/ignite_flightex

Rocket Seat - Ignite - Elixir - Challenge 5 - An airline manager w/ Structs and Agents.
https://github.com/librity/ignite_flightex

challenge elixir rocketseat-ignite

Last synced: 14 days ago
JSON representation

Rocket Seat - Ignite - Elixir - Challenge 5 - An airline manager w/ Structs and Agents.

Awesome Lists containing this project

README

          

# Flightex

## Table of Contents

- [About](#about)
- [Bash Commands](#bash_commands)
- [Elixir Commands](#elixir_commands)
- [Libs](#libs)
- [Docs](#docs)
- [Resources](#resources)

## About

A demo Elixir program that uses `Structs` as `Data Transfer Objects`,
and `Agents` to persist state between precesses.

Challenge 5 of Ignite Elixir, a bootcamp by Rocket Seat.

## Bash Commands

```bash
# Create new Elixir project
$ mix new project_name
# Intall dependencies
$ mix deps.get
# Generate linter config
$ mix credo gen.config
# Run linter
$ mix credo --strict
# Start your project as an Interactive Elixir session
$ iex -S mix
# Run tests
$ mix test
```

## Elixir Commands

Expected behavior:

```elixir
> Flightex.create_user(params)
{:ok, user_id}

> Flightex.create_booking(user_id, params)
{:ok, booking_id}

> Flightex.create_booking(invalid_user_id, params)
{:error, "User not found"}

> Flightex.get_booking(booking_id)
{:ok, %Booking{...}}

> Flightex.get_booking(invalid_booking_id)
{:error, "Flight Booking not found"}
```

Naive Date Time (Date-time without timezone):

```elixir
> NaiveDateTime.from_iso8601("2015-01-23 23:50:07")
{:ok, ~N[2015-01-23 23:50:07]}
> NaiveDateTime.from_iso8601!("2015-01-23 23:50:07")
~N[2015-01-23 23:50:07]
> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
> utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
#DateTime<2000-02-29 23:00:07+01:00 CET Europe/Warsaw>
> NaiveDateTime.to_erl(dt)
{{2000, 2, 29}, {23, 0, 7}}
```

UUID4 validation:

```elixir
> {:ok, [{:uuid, valid_uuid} | _tails]} = UUID.uuid4() |> UUID.info()
{:ok,
[
uuid: "52224694-3cee-48f9-938c-ab99830c2881",
binary: <<82, 34, 70, 148, 60, 238, 72, 249, 147, 140, 171, 153, 131, 12, 40,
129>>,
type: :default,
version: 4,
variant: :rfc4122
]}
> valid_uuid
"52224694-3cee-48f9-938c-ab99830c2881"
> {:error, message} = "SOFUNKY" |> UUID.info()
{:error, "Invalid argument; Not a valid UUID: sofunky"}
```

User Agent and Creator:

```elixir
> Flightex.start_agents()
> user_params = Flightex.Factory.build(:user)

> {:ok, user_id} = Flightex.create_user(user_params)
{:ok, "9a68c5da-2f51-4e5e-a2b8-21b7dee48105"}

> Flightex.update_user(user_id, user_params)
{:ok, "9a68c5da-2f51-4e5e-a2b8-21b7dee48105"}
> Flightex.update_user("SOFUNKY", user_params)
{:error, "User not found."}

> Flightex.get_user(user_id)
{:ok,
%Flightex.Users.User{
cpf: "1234567",
email: "iggy@murderbusiness.org",
id: "9a68c5da-2f51-4e5e-a2b8-21b7dee48105",
name: "Iggy Azalea"
}}
> Flightex.get_user("SOFUNKY")
{:error, "User not found."}

> Flightex.get_users
%{
"9a68c5da-2f51-4e5e-a2b8-21b7dee48105" => %Flightex.Users.User{
cpf: "1234567",
email: "iggy@murderbusiness.org",
id: "9a68c5da-2f51-4e5e-a2b8-21b7dee48105",
name: "Iggy Azalea"
}
}
```

Booking Agent and Creator:

```elixir
> Flightex.start_agents()
> booking_params = Flightex.Factory.build(:booking_params)
> user_params = Flightex.Factory.build(:user_params)
> {:ok, user_id} = Flightex.create_user(user_params)
{:ok, "02cf4d12-38bc-46fe-9785-af179fd7053f"}

> {:ok, booking_id} = Flightex.create_booking(user_id, booking_params)
{:ok, "5c16bda3-d637-4790-b073-7fc00d9b3fea"}

> Flightex.update_booking(booking_id, user_id, booking_params)
{:ok, "5c16bda3-d637-4790-b073-7fc00d9b3fea"}
> Flightex.update_booking("SOFUNKY", user_id, booking_params)
{:error, "Booking not found."}

> Flightex.get_booking(booking_id)
{:ok,
%Flightex.Bookings.Booking{
departure: ~N[2014-03-04 23:59:59],
going_to: "Tokyo",
id: "5c16bda3-d637-4790-b073-7fc00d9b3fea",
leaving_from: "LAX",
user_id: "02cf4d12-38bc-46fe-9785-af179fd7053f"
}}
> Flightex.get_booking("SOFUNKY")
{:error, "Booking not found."}
)> Flightex.get_bookings
%{
"5c16bda3-d637-4790-b073-7fc00d9b3fea" => %Flightex.Bookings.Booking{
departure: ~N[2014-03-04 23:59:59],
going_to: "Tokyo",
id: "5c16bda3-d637-4790-b073-7fc00d9b3fea",
leaving_from: "LAX",
user_id: "02cf4d12-38bc-46fe-9785-af179fd7053f"
}
}
```

## Libs

- https://github.com/rrrene/credo
- https://github.com/zyro/elixir-uuid
- https://github.com/bitwalker/timex
- https://github.com/thoughtbot/ex_machina

## Docs

- https://elixir-lang.org/crash-course.html
- https://hexdocs.pm/elixir/NaiveDateTime.html#from_iso8601/2
- https://hexdocs.pm/elixir/Date.html#from_iso8601/2
- https://hexdocs.pm/elixir/Time.html#t:t/0
- https://hexdocs.pm/timex/getting-started.html
- https://hexdocs.pm/ex_machina/readme.html

## Resources

- https://marketplace.visualstudio.com/items?itemName=pantajoe.vscode-elixir-credo
- https://stackoverflow.com/questions/51600416/elixir-add-timezone-data-to-naive-date-time
- https://stackoverflow.com/questions/40444970/how-to-convert-a-string-into-an-ecto-datetime-in-elixir