SimpleRestView

Description:

SimpleRestView is a library to help you shorten the amount of code needed to write your views in Phoenix framework when generating json data for a REST service.

Functions:

render_schema()

input parameters:
1 - Reference to a schema containing all the fields you wish to render<br> 2 - Result from a query <br> 3 - Options (optional): <br>

Example

With result from query:

%User{
id: 1,
username: "usr1",
reviewed: [
  %Review{...},
  %Review{...}
],
...}

passed in as second parameter to function:

SimpleRestView.render_schema(User, user, only: [:id, :username], 
                              add: [
                                 avg_rating: (fn user -> calc_avg_rating(user.id) end),
                                 reviewed: {Review, :reviewed, many: true}                     
                                ]                                 
                            )

result would be:

%{id: 1,
  username: "usr1",  
  reviewed: [{...}, {...}],
  avg_rating: ...}

<br>

usage:

Following call:

alias MyApp.SimpleRestView, as: SimpleRV

    def render(..., %{user, user}) do
      User
      |> SimpleRV.render_schema(user)
    end

is equivalent to

    def render(..., %{user, user}) do
      %{id: user.id,
        username: user.username,
        email: user.email,
        ...}  
    end

<br><br>

Following call:

    def render(..., %{user, user}) do
      User
      |> SimpleRV.render_schema(user, only: [:id, :username],
           add: [
              reviewed: {Review, :reviewed, many: true},
              custom_field: (fn review -> some_function(review.id) end)
               ])
    end

is equivalent to

    def render(..., %{user, user}) do
      %{id: user.id,
        username: user.username
        reviewed: render_many(user.reviewed, ReviewView, "review.json")}
    end

...
defmodule MyApp.ReviewView do
  ...
  
    def render("review.json", %{review: review}) do
      %{id: review.id,
        comment: review.comment,
        ...
        custom_field: some_function(review.id)}   
    end
end

<br>

render_wrapper()

usage: Following call:

alias MyApp.SimpleRestView, as: SimpleRV

    def render(..., %{user, user}) do
      User
      |> SimpleRV.render_schema(user)
      |> SimpleRV.render_wrapper()
    end

is equivalent to


    def render(..., %{user: user}) do
      %{data: render_one(user, UserView, "user.json")}
    end

    def render("user.json", %{user, user}) do
      %{id: user.id,
        username: user.username,
        email: user.email,
        ...}  
    end

<br>

render_paginated_wrapper()

usage:

Following call:

    def render(..., %{users, users}) do
      User
      |> SimpleRV.render_schema(users.entries, only: [:id, :username], many: true,
           add: [
              reviewed: {Review, :reviewed, many: true, 
                  add: [custom_field: (fn review -> some_function(review.id) end)]
                  },
               ])
      |> SimpleRV.render_paginated_wrapper(user)
    end

is equivalent to

    def render(..., %{users, users}) do
      %{data: render_many(users.entries, UserView, "user.json"),
        page_number: users.page_number,
        page_size: users.page_size,
        total_entries: users.total_entries,
        total_pages: users.total_pages}   
    end    

    def render("user.json", %{user, user}) do
      %{id: user.id,
        username: user.username
        reviewed: render_many(user.reviewed, ReviewView, "review.json")}
    end

...
defmodule MyApp.ReviewView do
  ...
  
    def render("review.json", %{review: review}) do
      %{id: review.id,
        comment: review.comment,
        ...
        custom_field: some_function(review.id)}   
    end
end

Installation

The package can be installed by adding simple_rest_view to your list of dependencies in mix.exs:

def deps do
  [
    {:simple_rest_view, "~> 0.1.0"}
  ]
end