diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 51f9df0..a318c59 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -6,6 +6,7 @@ module Admin def index @users = User.order(:full_name) + render json: UserSerializer.for(@users) end def show diff --git a/app/controllers/calculator_controller.rb b/app/controllers/calculator_controller.rb index a3a6ffd..8a714f4 100644 --- a/app/controllers/calculator_controller.rb +++ b/app/controllers/calculator_controller.rb @@ -60,6 +60,7 @@ class CalculatorController < ApplicationController def ingredient_search @foods = Food.has_density.search(params[:query]).order(:name) + render json: @foods.map { |f| {id: f.id, name: f.name, density: f.density} } end end \ No newline at end of file diff --git a/app/controllers/foods_controller.rb b/app/controllers/foods_controller.rb index 2abbde6..66b7807 100644 --- a/app/controllers/foods_controller.rb +++ b/app/controllers/foods_controller.rb @@ -1,6 +1,6 @@ class FoodsController < ApplicationController - before_action :set_food, only: [:show, :edit, :update, :destroy] + before_action :set_food, only: [:show, :update, :destroy] before_action :ensure_valid_user, except: [:index, :show] @@ -11,20 +11,11 @@ class FoodsController < ApplicationController if params[:name].present? @foods = @foods.matches_tokens(:name, params[:name].split.take(4)) end + render json: FoodSummarySerializer.for(@foods, collection_name: 'foods') end def show - - end - - # GET /foods/new - def new - @food = Food.new - end - - # GET /foods/1/edit - def edit - ensure_owner @food + render json: FoodSerializer.for(@food) end # POST /foods @@ -92,27 +83,13 @@ class FoodsController < ApplicationController @food.set_usda_food(UsdaFood.find_by_ndbn(@food.ndbn)) end - render :show - end - - def convert - @conversion = Conversion.new(conversion_params) - - if @conversion.valid? - @output_quantity = @conversion.output_quantity - @conversion = Conversion.new - else - @output_quantity = '' - end + render json: FoodSerializer.for(@food) end def usda_food_search @foods = UsdaFood.search(params[:query]).limit(250).order(:long_description) - respond_to do |format| - format.html { render :layout => false } - format.json { } - end + render json: UsdaFoodSerializer.for(@foods) end private diff --git a/app/controllers/ingredients_controller.rb b/app/controllers/ingredients_controller.rb index 91a5f30..4c6ce14 100644 --- a/app/controllers/ingredients_controller.rb +++ b/app/controllers/ingredients_controller.rb @@ -4,6 +4,16 @@ class IngredientsController < ApplicationController @ingredients = Food.search(params[:query]).order(:name).to_a @ingredients.concat(Recipe.is_ingredient.search_by_name(params[:query]).order(:name).to_a) @ingredients.sort { |a, b| a.name <=> b.name } - end + + json = @ingredients.map do |i| + { + id: i.ingredient_id, + ingredient_id: i.ingredient_id, + name: i.name, + density: i.density + } + end -end \ No newline at end of file + render json: json + end +end diff --git a/app/controllers/logs_controller.rb b/app/controllers/logs_controller.rb index 48afd93..695475a 100644 --- a/app/controllers/logs_controller.rb +++ b/app/controllers/logs_controller.rb @@ -8,14 +8,17 @@ class LogsController < ApplicationController def index @logs = Log.for_user(current_user).order(date: :desc).page(params[:page]).per(params[:per]) + render json: LogSummarySerializer.for(@logs, collection_name: 'logs') end def show ensure_owner(@log) + render json: LogSerializer.for(@log) end def edit ensure_owner(@log) + render json: LogSerializer.for(@log) end def update diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb index 964c35f..d04e22b 100644 --- a/app/controllers/recipes_controller.rb +++ b/app/controllers/recipes_controller.rb @@ -1,8 +1,8 @@ class RecipesController < ApplicationController - before_action :set_recipe, only: [:show, :edit, :update, :destroy] + before_action :set_recipe, only: [:show, :update, :destroy] - before_action :ensure_valid_user, except: [:show, :scale, :index] + before_action :ensure_valid_user, except: [:show, :index] # GET /recipes def index diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 4e7850c..fa2ad86 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -6,11 +6,12 @@ class TagsController < ApplicationController def prefetch @tags = Tag.all.order(:name) - render :search + render json: TagSerializer.for(@tags) end def search @tags = Tag.search(params[:query]).order(:name) + render json: TagSerializer.for(@tags) end end \ No newline at end of file diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8f7065c..fb0f873 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -4,6 +4,11 @@ class UsersController < ApplicationController skip_before_action :verify_authenticity_token, only: [:verify_login] def show + if current_user + render json: UserSerializer.for(current_user) + else + render json: nil + end end def login @@ -26,7 +31,7 @@ class UsersController < ApplicationController if user = User.authenticate(params[:username], params[:password]) set_current_user(user) format.html { redirect_to root_path, notice: "Welcome, #{user.display_name}" } - format.json { render json: { success: true, user: { id: user.id, name: user.display_name, admin: user.admin? } } } + format.json { render json: { success: true, user: UserSerializer.for(current_user).serialize } } else format.html { flash[:error] = "Invalid credentials"; render :login } format.json { render json: { success: false, message: 'Invalid Credentials', user: nil } } diff --git a/app/javascript/components/TheAboutPage.vue b/app/javascript/components/TheAboutPage.vue index 0488ece..4f3424a 100644 --- a/app/javascript/components/TheAboutPage.vue +++ b/app/javascript/components/TheAboutPage.vue @@ -3,11 +3,11 @@

About

- A Recipe manager. Source available from my Git repository at https://source.elbert.us. + A Recipe manager. Source available at https://source.elbert.us.

- Parsley is released under the MIT License. All code © Dan Elbert 2018. + Parsley is released under the MIT License. All code © Dan Elbert 2020.

diff --git a/app/serializers/application_serializer.rb b/app/serializers/application_serializer.rb index 56439d4..11974f7 100644 --- a/app/serializers/application_serializer.rb +++ b/app/serializers/application_serializer.rb @@ -1,5 +1,6 @@ class ApplicationSerializer class CollectionSerializer < ApplicationSerializer + def initialize(items, serializer, opts = {}) super(items, opts) @collection_name = opts[:collection_name] @@ -38,8 +39,12 @@ class ApplicationSerializer @options = opts end + def item_properties(*keys) + Hash[keys.map { |k| [k.to_sym, @item.send(k.to_sym)] }] + end + def serialize - @item.as_json + @item.as_json end def as_json(*args) @@ -51,4 +56,4 @@ class ApplicationSerializer self.as_json(*args).to_json end end -end \ No newline at end of file +end diff --git a/app/serializers/food_serializer.rb b/app/serializers/food_serializer.rb new file mode 100644 index 0000000..3d0ac8f --- /dev/null +++ b/app/serializers/food_serializer.rb @@ -0,0 +1,56 @@ +class FoodSerializer < ApplicationSerializer + + def serialize + { + **item_properties(:id, + :name, + :ndbn, + :usda_food_name, + :notes, + :density, + :water, + :ash, + :protein, + :kcal, + :fiber, + :sugar, + :carbohydrates, + :calcium, + :iron, + :magnesium, + :phosphorus, + :potassium, + :sodium, + :zinc, + :copper, + :manganese, + :vit_c, + :vit_b6, + :vit_b12, + :vit_a, + :vit_e, + :vit_d, + :vit_k, + :cholesterol, + :lipids), + + ndbn_units: self.ndbn_units, + food_units: item.food_units.map { |u| { id: u.id, name: u.name, gram_weight: u.gram_weight, _destroy: false } } + } + end + + def ndbn_units + if item.ndbn.present? + item.usda_food.usda_food_weights.map do |fw| + { + amount: fw.amount, + description: fw.description, + gram_weight: fw.gram_weight + } + end + else + [] + end + end + +end \ No newline at end of file diff --git a/app/serializers/food_summary_serializer.rb b/app/serializers/food_summary_serializer.rb new file mode 100644 index 0000000..43a6e78 --- /dev/null +++ b/app/serializers/food_summary_serializer.rb @@ -0,0 +1,23 @@ +class FoodSummarySerializer < ApplicationSerializer + + def serialize + { + id: item.id, + name: item.name, + ndbn: item.ndbn, + kcal: item.kcal, + usda: item.ndbn.present?, + density: pretty_density + } + end + + def pretty_density + if item.density.present? + value = UnitConversion::parse(item.density) + value.convert('oz/cup').change_formatter(UnitConversion::DecimalFormatter.new).pretty_value + else + nil + end + end + +end \ No newline at end of file diff --git a/app/serializers/log_serializer.rb b/app/serializers/log_serializer.rb new file mode 100644 index 0000000..93e06ef --- /dev/null +++ b/app/serializers/log_serializer.rb @@ -0,0 +1,13 @@ +class LogSerializer < ApplicationSerializer + + def serialize + { + id: item.id, + date: item.date, + rating: item.rating, + notes: item.notes, + recipe: RecipeSerializer.for(item.recipe).serialize + } + end + +end \ No newline at end of file diff --git a/app/serializers/log_summary_serializer.rb b/app/serializers/log_summary_serializer.rb new file mode 100644 index 0000000..20ce44f --- /dev/null +++ b/app/serializers/log_summary_serializer.rb @@ -0,0 +1,16 @@ +class LogSummarySerializer < ApplicationSerializer + + def serialize + { + id: item.id, + date: item.date, + rating: item.rating, + notes: item.notes, + recipe: { + id: item.recipe.id, + name: item.recipe.name + } + } + end + +end \ No newline at end of file diff --git a/app/serializers/tag_serializer.rb b/app/serializers/tag_serializer.rb new file mode 100644 index 0000000..a308550 --- /dev/null +++ b/app/serializers/tag_serializer.rb @@ -0,0 +1,7 @@ +class TagSerializer < ApplicationSerializer + def serialize + { + **item_properties(:id, :name) + } + end +end \ No newline at end of file diff --git a/app/serializers/usda_food_serializer.rb b/app/serializers/usda_food_serializer.rb new file mode 100644 index 0000000..35bab52 --- /dev/null +++ b/app/serializers/usda_food_serializer.rb @@ -0,0 +1,8 @@ +class UsdaFoodSerializer < ApplicationSerializer + def serialize + { + **item_properties(:ndbn, :kcal, :carbohydrates, :lipid, :protein), + name: item.long_description + } + end +end \ No newline at end of file diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb new file mode 100644 index 0000000..ab060e8 --- /dev/null +++ b/app/serializers/user_serializer.rb @@ -0,0 +1,16 @@ +class UserSerializer < ApplicationSerializer + + def serialize + { + id: item.id, + username: item.username, + email: item.email, + full_name: item.full_name, + name: item.display_name, + admin: item.admin?, + created_at: item.created_at, + updated_at: item.updated_at + } + end + +end \ No newline at end of file diff --git a/app/views/admin/users/index.json.jbuilder b/app/views/admin/users/index.json.jbuilder deleted file mode 100644 index 5191d0b..0000000 --- a/app/views/admin/users/index.json.jbuilder +++ /dev/null @@ -1,5 +0,0 @@ - -json.array! @users do |u| - json.extract! u, :id, :username, :full_name, :email, :admin - json.name u.display_name -end \ No newline at end of file diff --git a/app/views/calculator/ingredient_search.json.jbuilder b/app/views/calculator/ingredient_search.json.jbuilder deleted file mode 100644 index f3f5124..0000000 --- a/app/views/calculator/ingredient_search.json.jbuilder +++ /dev/null @@ -1,6 +0,0 @@ - -json.array! @foods do |i| - - json.extract! i, :id, :name, :density - -end \ No newline at end of file diff --git a/app/views/foods/convert.json.jbuilder b/app/views/foods/convert.json.jbuilder deleted file mode 100644 index a8ed4ba..0000000 --- a/app/views/foods/convert.json.jbuilder +++ /dev/null @@ -1,4 +0,0 @@ - -json.success !@output_quantity.blank? -json.output_quantity @output_quantity -json.form_html render(partial: 'recipes/editor/conversion_form', formats: [:html]) \ No newline at end of file diff --git a/app/views/foods/index.json.jbuilder b/app/views/foods/index.json.jbuilder deleted file mode 100644 index cb058d6..0000000 --- a/app/views/foods/index.json.jbuilder +++ /dev/null @@ -1,20 +0,0 @@ - -json.cache_root!(@foods, version: @foods.cache_version) do - - json.extract! @foods, :total_count, :total_pages, :current_page - json.page_size @foods.limit_value - - json.foods @foods do |i| - json.extract! i, :id, :name, :ndbn, :kcal - json.usda i.ndbn.present? - - if i.density.present? - value = UnitConversion::parse(i.density) - json.density value.convert('oz/cup').change_formatter(UnitConversion::DecimalFormatter.new).pretty_value - else - json.density nil - end - - end - -end \ No newline at end of file diff --git a/app/views/foods/search.json.jbuilder b/app/views/foods/search.json.jbuilder deleted file mode 100644 index 5eb7fb8..0000000 --- a/app/views/foods/search.json.jbuilder +++ /dev/null @@ -1,6 +0,0 @@ - -json.array! @foods do |i| - - json.extract! i, :id, :name, :density, :notes - -end \ No newline at end of file diff --git a/app/views/foods/show.json.jbuilder b/app/views/foods/show.json.jbuilder deleted file mode 100644 index df9af7c..0000000 --- a/app/views/foods/show.json.jbuilder +++ /dev/null @@ -1,46 +0,0 @@ - -json.extract! @food, - :id, - :name, - :ndbn, - :usda_food_name, - :notes, - :density, - :water, - :ash, - :protein, - :kcal, - :fiber, - :sugar, - :carbohydrates, - :calcium, - :iron, - :magnesium, - :phosphorus, - :potassium, - :sodium, - :zinc, - :copper, - :manganese, - :vit_c, - :vit_b6, - :vit_b12, - :vit_a, - :vit_e, - :vit_d, - :vit_k, - :cholesterol, - :lipids - -if @food.ndbn.present? - json.ndbn_units @food.usda_food.usda_food_weights do |fw| - json.extract! fw, :amount, :description, :gram_weight - end -else - json.ndbn_units [] -end - -json.food_units @food.food_units do |iu| - json.extract! iu, :id, :name, :gram_weight - json._destroy false -end \ No newline at end of file diff --git a/app/views/foods/usda_food_search.json.jbuilder b/app/views/foods/usda_food_search.json.jbuilder deleted file mode 100644 index 46d9e0f..0000000 --- a/app/views/foods/usda_food_search.json.jbuilder +++ /dev/null @@ -1,8 +0,0 @@ - -json.array! @foods do |f| - - json.extract! f, :ndbn, :kcal, :carbohydrates, :lipid, :protein - json.name f.long_description - - -end \ No newline at end of file diff --git a/app/views/ingredients/search.json.jbuilder b/app/views/ingredients/search.json.jbuilder deleted file mode 100644 index ce8f998..0000000 --- a/app/views/ingredients/search.json.jbuilder +++ /dev/null @@ -1,7 +0,0 @@ - -json.array! @ingredients do |i| - - json.extract! i, :ingredient_id, :name, :density - json.id i.ingredient_id - -end \ No newline at end of file diff --git a/app/views/logs/index.json.jbuilder b/app/views/logs/index.json.jbuilder deleted file mode 100644 index 636e9c6..0000000 --- a/app/views/logs/index.json.jbuilder +++ /dev/null @@ -1,16 +0,0 @@ - -json.cache_root!(@logs, version: @logs.cache_version) do - - json.extract! @logs, :total_count, :total_pages, :current_page - json.page_size @logs.limit_value - - json.logs @logs do |l| - json.extract! l, :id, :date, :rating, :notes - - json.recipe do - json.id l.recipe.id - json.name l.recipe.name - end - end - -end \ No newline at end of file diff --git a/app/views/logs/show.json.jbuilder b/app/views/logs/show.json.jbuilder deleted file mode 100644 index 4498db8..0000000 --- a/app/views/logs/show.json.jbuilder +++ /dev/null @@ -1,6 +0,0 @@ - -json.extract! @log, :id, :date, :rating, :notes - -json.recipe do - json.partial! 'recipes/recipe', recipe: @log.recipe -end \ No newline at end of file diff --git a/app/views/recipes/_recipe.json.jbuilder b/app/views/recipes/_recipe.json.jbuilder deleted file mode 100644 index 6d5f6bf..0000000 --- a/app/views/recipes/_recipe.json.jbuilder +++ /dev/null @@ -1,34 +0,0 @@ - - -json.extract! recipe, :id, :name, :rating, :yields, :total_time, :active_time, :source, :is_ingredient, :created_at, :updated_at, :step_text, :converted_scale, :converted_system, :converted_unit - -json.rendered_steps MarkdownProcessor.render(recipe.step_text) - -json.tags recipe.tag_names - -json.ingredients recipe.recipe_ingredients do |ri| - json.extract! ri, :id, :ingredient_id, :display_name, :name, :quantity, :units, :preparation, :sort_order - - json.ingredient do - if ri.food.nil? && ri.recipe_as_ingredient.nil? - json.null! - elsif ri.food - json.extract! ri.food, :name, :density, :notes - else - json.extract! ri.recipe_as_ingredient, :name - end - end - - json._destroy false -end - -json.nutrition_data do - json.errors recipe.nutrition_data.errors - - json.nutrients NutritionData::NUTRIENTS.select { |_, v| v.present? } do |name, label| - json.name name - json.label label - json.value recipe.nutrition_data.send(name) - end - -end \ No newline at end of file diff --git a/app/views/recipes/index.json.jbuilder b/app/views/recipes/index.json.jbuilder deleted file mode 100644 index 17c0f33..0000000 --- a/app/views/recipes/index.json.jbuilder +++ /dev/null @@ -1,13 +0,0 @@ - -json.cache_root!(@recipes.cache_key, version: @recipes.cache_version) do - - json.extract! @recipes, :total_count, :total_pages, :current_page - json.page_size @recipes.limit_value - - json.recipes @recipes do |r| - json.extract! r, :id, :name, :rating, :yields, :total_time, :active_time, :created_at, :updated_at - - json.tags r.tag_names - end - -end \ No newline at end of file diff --git a/app/views/recipes/show.json.jbuilder b/app/views/recipes/show.json.jbuilder deleted file mode 100644 index fcb6de8..0000000 --- a/app/views/recipes/show.json.jbuilder +++ /dev/null @@ -1,5 +0,0 @@ -json.cache_root!(@recipe, version: @recipe.cache_version) do - - json.partial! 'recipe', recipe: @recipe - -end diff --git a/app/views/users/show.json.jbuilder b/app/views/users/show.json.jbuilder deleted file mode 100644 index 80a357b..0000000 --- a/app/views/users/show.json.jbuilder +++ /dev/null @@ -1,8 +0,0 @@ - -if current_user - json.extract! current_user, :id, :username, :email, :full_name, :admin - - json.name current_user.display_name -else - json.nil! -end