From 30b290514f69d1950c0d374ba361a257ecdb8858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Geonizeli?= Date: Wed, 4 Aug 2021 21:53:58 -0300 Subject: [PATCH] add user document model --- Gemfile | 4 +- Gemfile.lock | 7 +++ .../admin/user_documents_controller.rb | 8 +++ app/dashboards/user_document_dashboard.rb | 54 +++++++++++++++++++ app/models/user.rb | 2 + app/models/user_document.rb | 30 +++++++++++ config/routes.rb | 3 +- .../20210805000225_create_user_documents.rb | 11 ++++ db/schema.rb | 11 +++- spec/models/user_document_spec.rb | 27 ++++++++++ spec/models/user_spec.rb | 4 ++ 11 files changed, 158 insertions(+), 3 deletions(-) create mode 100644 app/controllers/admin/user_documents_controller.rb create mode 100644 app/dashboards/user_document_dashboard.rb create mode 100644 app/models/user_document.rb create mode 100644 db/migrate/20210805000225_create_user_documents.rb create mode 100644 spec/models/user_document_spec.rb diff --git a/Gemfile b/Gemfile index 2e53c9d..aade363 100644 --- a/Gemfile +++ b/Gemfile @@ -18,10 +18,12 @@ gem "devise" gem "devise-i18n" gem "devise-bootstrap-views" +gem "administrate-field-active_storage" gem "tailwindcss-rails" gem "administrate" -gem "graphql" +gem "enumerize" gem "httparty" +gem "graphql" gem "pundit" group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index 4728078..083982b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -72,6 +72,9 @@ GEM momentjs-rails (~> 2.8) sassc-rails (~> 2.1) selectize-rails (~> 0.6) + administrate-field-active_storage (0.3.7) + administrate (>= 0.2.2) + rails (>= 6.0) annotate (3.1.1) activerecord (>= 3.2, < 7.0) rake (>= 10.4, < 14.0) @@ -109,6 +112,8 @@ GEM dotenv-rails (2.7.6) dotenv (= 2.7.6) railties (>= 3.2) + enumerize (2.4.0) + activesupport (>= 3.2) erubi (1.10.0) ffi (1.15.3) globalid (0.5.2) @@ -319,6 +324,7 @@ PLATFORMS DEPENDENCIES administrate + administrate-field-active_storage annotate bootsnap (>= 1.4.4) capybara @@ -326,6 +332,7 @@ DEPENDENCIES devise-bootstrap-views devise-i18n dotenv-rails + enumerize graphql graphql_playground-rails httparty diff --git a/app/controllers/admin/user_documents_controller.rb b/app/controllers/admin/user_documents_controller.rb new file mode 100644 index 0000000..6fc8f77 --- /dev/null +++ b/app/controllers/admin/user_documents_controller.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +module Admin + class UserDocumentsController < Admin::ApplicationController + def valid_action?(name, resource = resource_class) + ["destroy"].exclude?(name.to_s) && super + end + end +end diff --git a/app/dashboards/user_document_dashboard.rb b/app/dashboards/user_document_dashboard.rb new file mode 100644 index 0000000..29d7a1d --- /dev/null +++ b/app/dashboards/user_document_dashboard.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true +require "administrate/base_dashboard" + +class UserDocumentDashboard < 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 = { + id: Field::Number, + user: Field::BelongsTo, + image: Field::ActiveStorage, + status: Field::Select.with_options(collection: UserDocument.status.values), + 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, :status].freeze + + # SHOW_PAGE_ATTRIBUTES + # an array of attributes that will be displayed on the model's show page. + SHOW_PAGE_ATTRIBUTES = [:id, :user, :status, :image, :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 = [:status].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 user documents are displayed + # across all pages of the admin dashboard. + # + # def display_resource(user_document) + # "UserDocument ##{user_document.id}" + # end +end diff --git a/app/models/user.rb b/app/models/user.rb index 76a2265..7073a2d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -16,6 +16,8 @@ # index_users_on_email (email) UNIQUE # class User < ApplicationRecord + has_many :documents, class_name: "UserDocument", dependent: :destroy + validates :first_name, :last_name, :email, presence: true def full_name diff --git a/app/models/user_document.rb b/app/models/user_document.rb new file mode 100644 index 0000000..df5578c --- /dev/null +++ b/app/models/user_document.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: user_documents +# +# id :bigint not null, primary key +# status :string not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint not null +# +# Indexes +# +# index_user_documents_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +class UserDocument < ApplicationRecord + extend Enumerize + + belongs_to :user + has_one_attached :image + + enumerize :status, + in: [:pending_review, :approved, :refused], + default: :pending_review +end diff --git a/config/routes.rb b/config/routes.rb index 60f56ab..ccf16ca 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,6 +4,7 @@ Rails.application.routes.draw do namespace :admin do resources :users + resources :user_documents resources :admin_users root to: "users#index" @@ -11,7 +12,7 @@ Rails.application.routes.draw do root to: "home#index" get "*all" => "home#index", constraints: lambda { |req| - Rails.env.development? ? req.path.exclude?("playground") : req + req.path.exclude?("playground") && req.path.exclude?("rails") } post "/graphql", to: "graphql#execute" diff --git a/db/migrate/20210805000225_create_user_documents.rb b/db/migrate/20210805000225_create_user_documents.rb new file mode 100644 index 0000000..8d663a3 --- /dev/null +++ b/db/migrate/20210805000225_create_user_documents.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +class CreateUserDocuments < ActiveRecord::Migration[6.1] + def change + create_table(:user_documents) do |t| + t.string(:status, null: false) + t.references(:user, null: false, foreign_key: true) + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 3c1943b..edd001a 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_04_233306) do +ActiveRecord::Schema.define(version: 2021_08_05_000225) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -55,6 +55,14 @@ ActiveRecord::Schema.define(version: 2021_08_04_233306) do t.index ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true end + create_table "user_documents", force: :cascade do |t| + t.string "status", null: false + t.bigint "user_id", null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["user_id"], name: "index_user_documents_on_user_id" + end + create_table "users", force: :cascade do |t| t.string "first_name", null: false t.string "last_name", null: false @@ -66,4 +74,5 @@ ActiveRecord::Schema.define(version: 2021_08_04_233306) 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 "user_documents", "users" end diff --git a/spec/models/user_document_spec.rb b/spec/models/user_document_spec.rb new file mode 100644 index 0000000..d13bd1a --- /dev/null +++ b/spec/models/user_document_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: user_documents +# +# id :bigint not null, primary key +# status :string not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint not null +# +# Indexes +# +# index_user_documents_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +require "rails_helper" + +RSpec.describe(UserDocument, type: :model) do + describe "associations" do + it { is_expected.to(belong_to(:user)) } + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 94b73f9..d1af9d9 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -23,4 +23,8 @@ RSpec.describe(User, type: :model) do it { is_expected.to(validate_presence_of(:last_name)) } it { is_expected.to(validate_presence_of(:email)) } end + + describe "associations" do + it { is_expected.to(have_many(:documents)) } + end end