README.md

# StrawHat.Review

[![Build Status](https://travis-ci.org/straw-hat-team/straw_hat_review.svg?branch=master)](https://travis-ci.org/straw-hat-team/straw_hat_review)
[![codecov](https://codecov.io/gh/straw-hat-team/straw_hat_review/branch/master/graph/badge.svg)](https://codecov.io/gh/straw-hat-team/straw_hat_review)
[![Inline docs](http://inch-ci.org/github/straw-hat-team/straw_hat_review.svg)](http://inch-ci.org/github/straw-hat-team/straw_hat_review)

`StrawHat.Review` will help you to add reviews to your systems. We took
inspiration from Amazon, Lyf, Google, Uber and Fiverr review systems. 

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `straw_hat_review` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:straw_hat_review, "~> 0.1"}
  ]
end
```

## Usage

We will cover the basic interactions of the systems but please check out
each Interactor module which are the ones that expose the API that developers
should be using.

### Aspects

Let's create some aspects based on Fiverr Reviews.

```elixir
  # id: 1  
  StrawHat.Review.Aspects.create_review(%{
    name: "seller_communication"
  })  
  
  # id: 2  
  StrawHat.Review.Aspects.create_review(%{
    name: "service_as_described"
  })
  
  # id: 3
  StrawHat.Review.Aspects.create_review(%{
    name: "would_recommend"
  })
```

### Reviews

Now let's give some review to a user.

Normally the reviewee and reviewer are just an string that your systems will 
know how to do the aggregation with that data. For example, your system that
uses `StrawHat.Review` knows that `"user:" <> user_id` is the way to read back
the user id of the reviewee and reviewer.

```elixir
  # id: 1
  StrawHat.Review.Review.create_review(%{
    reviewee_id: "user:1",
    reviewer_id: "user:2",
    comment: "Amazing experience, I really recommended it",
    aspects: [
      %{
        aspect_id: 1, # seller_communication
        score: 5
      }, 
      %{
        aspect_id: 2, # service_as_described
        score: 5
      },
      %{
        aspect_id: 3, # would_recommend
        score: 5
      }
    ]
    medias: [
      %Plug.Upload{
        content_type: "image/png",
        filename: "some_random_file_name.png",
        path: "~tmp/some_random_name.png"
      }
    ]
  })
```

### Comments

Now we could add some comments to the review.

```elixir
  # id: 1
  StrawHat.Review.Comments.create_comment(%{
    comment: "Really helpful review, thank you very much",
    owner_id: "user:3",
    review_id: 1
  })
```

### Reactions

We could create some reactions for the systems so it could be use later
on reviews and comments.

```elixir
  # id: 1
  StrawHat.Review.Reactions.create_reaction(%{
    name: "like"
  })
  
  # id: 2
  StrawHat.Review.Reactions.create_reaction(%{
    name: "dislike"
  })
```

Now we could react to the reviews and comments

```elixir
  StrawHat.Review.ReviewReactions.create_review_reaction(%{
    review_id: 1,
    reaction_id: 1,
    user_id: "user:1"
  })
  
  StrawHat.Review.CommentReactions.create_comment_reaction(%{
    review_id: 1,
    reaction_id: 1,
    user_id: "user:1"
  })
```

That is a basic usage of the package. Check the interactor modules for more
available APIs.