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>
- only - fields specified in only will be the only fields of schema to get rendered
- except - fields specified in except will be excluded from rendering. All other fields on schema will be rendered
- many - a boolean which determines if values passed in second parameter should be rendered as a single map or a list of maps, defaults to false (single map)
- include_timestamps - a boolean which determines whether to include timestamp fields (inserted_at, updated_at) in the rendered map, defaults to false
- add - enables adding fields. Can be specified in a format [field_name: {SchemaReference, :field_which_references_nested_schema, [options…]}] OR [field_name: (fn model -> end)] OR [field_name: %{custom_field: custom_val, …}]
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)
endis 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)
])
endis 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()
endis 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)
endis 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
endInstallation
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