From 38b60ca0fa0ea81d52fcddc3b64ca03b81ba2702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Geonizeli?= Date: Wed, 11 Aug 2021 09:28:42 -0300 Subject: [PATCH] add balance entity --- app/controllers/admin/balances_controller.rb | 5 ++ .../admin/currencies_controller.rb | 3 ++ app/dashboards/balance_dashboard.rb | 54 +++++++++++++++++++ app/dashboards/currency_dashboard.rb | 6 +-- app/models/balance.rb | 29 ++++++++++ app/models/user.rb | 1 + config/locales/activerecord.yml | 11 +++- config/routes.rb | 2 +- db/migrate/20210811121726_create_balances.rb | 13 +++++ db/schema.rb | 14 ++++- db/seeds.rb | 24 ++++++--- spec/models/balance_spec.rb | 35 ++++++++++++ spec/models/user_spec.rb | 1 + 13 files changed, 184 insertions(+), 14 deletions(-) create mode 100644 app/controllers/admin/balances_controller.rb create mode 100644 app/dashboards/balance_dashboard.rb create mode 100644 app/models/balance.rb create mode 100644 db/migrate/20210811121726_create_balances.rb create mode 100644 spec/models/balance_spec.rb diff --git a/app/controllers/admin/balances_controller.rb b/app/controllers/admin/balances_controller.rb new file mode 100644 index 0000000..ecad826 --- /dev/null +++ b/app/controllers/admin/balances_controller.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +module Admin + class BalancesController < Admin::ApplicationController + end +end diff --git a/app/controllers/admin/currencies_controller.rb b/app/controllers/admin/currencies_controller.rb index 95f67c7..46afa63 100644 --- a/app/controllers/admin/currencies_controller.rb +++ b/app/controllers/admin/currencies_controller.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true module Admin class CurrenciesController < Admin::ApplicationController + def valid_action?(name, resource = resource_class) + ["new", "edit", "destroy"].exclude?(name.to_s) && super + end end end diff --git a/app/dashboards/balance_dashboard.rb b/app/dashboards/balance_dashboard.rb new file mode 100644 index 0000000..e7ffaa1 --- /dev/null +++ b/app/dashboards/balance_dashboard.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true +require "administrate/base_dashboard" + +class BalanceDashboard < Administrate::BaseDashboard + # ATTRIBUTE_TYPES + # a hash that describes the type of each of the model's fields. + # + # Each different type represents an Administrate::Field object, + # which determines how the attribute is displayed + # on pages throughout the dashboard. + ATTRIBUTE_TYPES = { + user: Field::BelongsTo, + currency: Field::BelongsTo, + id: Field::Number, + amount: Field::String.with_options(searchable: false), + created_at: Field::DateTime, + updated_at: Field::DateTime, + }.freeze + + # COLLECTION_ATTRIBUTES + # an array of attributes that will be displayed on the model's index page. + # + # By default, it's limited to four items to reduce clutter on index pages. + # Feel free to add, remove, or rearrange items. + COLLECTION_ATTRIBUTES = [:user, :currency, :id, :amount].freeze + + # SHOW_PAGE_ATTRIBUTES + # an array of attributes that will be displayed on the model's show page. + SHOW_PAGE_ATTRIBUTES = [:user, :currency, :id, :amount, :created_at, :updated_at].freeze + + # FORM_ATTRIBUTES + # an array of attributes that will be displayed + # on the model's form (`new` and `edit`) pages. + FORM_ATTRIBUTES = [:user, :currency, :amount].freeze + + # COLLECTION_FILTERS + # a hash that defines filters that can be used while searching via the search + # field of the dashboard. + # + # For example to add an option to search for open resources by typing "open:" + # in the search field: + # + # COLLECTION_FILTERS = { + # open: ->(resources) { resources.where(open: true) } + # }.freeze + COLLECTION_FILTERS = {}.freeze + + # Overwrite this method to customize how balances are displayed + # across all pages of the admin dashboard. + # + # def display_resource(balance) + # "Balance ##{balance.id}" + # end +end diff --git a/app/dashboards/currency_dashboard.rb b/app/dashboards/currency_dashboard.rb index 9364ffa..bbf9036 100644 --- a/app/dashboards/currency_dashboard.rb +++ b/app/dashboards/currency_dashboard.rb @@ -46,7 +46,7 @@ class CurrencyDashboard < Administrate::BaseDashboard # Overwrite this method to customize how currencies are displayed # across all pages of the admin dashboard. # - # def display_resource(currency) - # "Currency ##{currency.id}" - # end + def display_resource(currency) + currency.name + end end diff --git a/app/models/balance.rb b/app/models/balance.rb new file mode 100644 index 0000000..8dfc70b --- /dev/null +++ b/app/models/balance.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: balances +# +# id :bigint not null, primary key +# amount :decimal(20, 10) default(0.0), not null +# created_at :datetime not null +# updated_at :datetime not null +# currency_id :bigint not null +# user_id :bigint not null +# +# Indexes +# +# index_balances_on_currency_id (currency_id) +# index_balances_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (currency_id => currencies.id) +# fk_rails_... (user_id => users.id) +# +class Balance < ApplicationRecord + belongs_to :user + belongs_to :currency + + validates :amount, presence: true +end diff --git a/app/models/user.rb b/app/models/user.rb index 29b0cfa..be95b3b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -25,6 +25,7 @@ class User < ApplicationRecord :recoverable, :rememberable, :validatable has_many :documents, class_name: "UserDocument", dependent: :destroy + has_many :balances, dependent: :restrict_with_error validates :first_name, :last_name, :email, presence: true validates :email, uniqueness: true diff --git a/config/locales/activerecord.yml b/config/locales/activerecord.yml index 803fcda..802053a 100644 --- a/config/locales/activerecord.yml +++ b/config/locales/activerecord.yml @@ -5,9 +5,16 @@ pt-BR: one: Documentos de Usuário other: Documentos de Usuários admin_user: - one: Usuário Administrador - other: Usuários Administradores + one: Administrador + other: Administradores + currency: + one: Moeda + other: Moedas + balance: + one: Saldo + other: Saldos attributes: user: first_name: Primeiro nome last_name: Último nome + full_name: Nome completo diff --git a/config/routes.rb b/config/routes.rb index 5eaa02c..6fb3107 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,7 +5,7 @@ Rails.application.routes.draw do namespace :admin do resources :users - resources :user_documents + resources :balances resources :currencies resources :admin_users diff --git a/db/migrate/20210811121726_create_balances.rb b/db/migrate/20210811121726_create_balances.rb new file mode 100644 index 0000000..8281e88 --- /dev/null +++ b/db/migrate/20210811121726_create_balances.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +class CreateBalances < ActiveRecord::Migration[6.1] + def change + create_table(:balances) do |t| + t.references(:user, null: false, foreign_key: true) + t.references(:currency, null: false, foreign_key: true) + + t.decimal(:amount, precision: 20, scale: 10, null: false, default: 0) + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 8d91afe..166df6e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_08_11_014107) do +ActiveRecord::Schema.define(version: 2021_08_11_121726) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -55,6 +55,16 @@ ActiveRecord::Schema.define(version: 2021_08_11_014107) do t.index ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true end + create_table "balances", force: :cascade do |t| + t.bigint "user_id", null: false + t.bigint "currency_id", null: false + t.decimal "amount", precision: 20, scale: 10, default: "0.0", null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["currency_id"], name: "index_balances_on_currency_id" + t.index ["user_id"], name: "index_balances_on_user_id" + end + create_table "currencies", force: :cascade do |t| t.string "name", null: false t.datetime "created_at", precision: 6, null: false @@ -85,5 +95,7 @@ ActiveRecord::Schema.define(version: 2021_08_11_014107) do add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" + add_foreign_key "balances", "currencies" + add_foreign_key "balances", "users" add_foreign_key "user_documents", "users" end diff --git a/db/seeds.rb b/db/seeds.rb index c8c1b75..a60d211 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,8 +1,18 @@ # frozen_string_literal: true -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup). -# -# Examples: -# -# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) -# Character.create(name: 'Luke', movie: movies.first) + +AdminUser.create(email: "admin@example.com", password: "password") + +user = User.create!( + first_name: "Test", + last_name: "User", + email: "user@example.com", + password: "password" +) + +currency = Currency.create!(name: "CAKE") + +Balance.create!( + user_id: user.id, + currency_id: currency.id, + amount: 153124.72088 +) diff --git a/spec/models/balance_spec.rb b/spec/models/balance_spec.rb new file mode 100644 index 0000000..67694fc --- /dev/null +++ b/spec/models/balance_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: balances +# +# id :bigint not null, primary key +# amount :decimal(20, 10) default(0.0), not null +# created_at :datetime not null +# updated_at :datetime not null +# currency_id :bigint not null +# user_id :bigint not null +# +# Indexes +# +# index_balances_on_currency_id (currency_id) +# index_balances_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (currency_id => currencies.id) +# fk_rails_... (user_id => users.id) +# +require "rails_helper" + +RSpec.describe(Balance, type: :model) do + describe "validations" do + it { is_expected.to(validate_presence_of(:amount)) } + end + + describe "associations" do + it { is_expected.to(belong_to(:user)) } + it { is_expected.to(belong_to(:currency)) } + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 19aa188..8845843 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -31,5 +31,6 @@ RSpec.describe(User, type: :model) do describe "associations" do it { is_expected.to(have_many(:documents)) } + it { is_expected.to(have_many(:balances)) } end end