diff --git a/.gitignore b/.gitignore index a36ad2e..3c230d8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,6 @@ /public/assets /.idea -/test +/db/schema.rb # Ignore master key for decrypting credentials and more. /config/master.key diff --git a/app/controllers/api/assemblies_controller.rb b/app/controllers/api/assemblies_controller.rb new file mode 100644 index 0000000..e1834c0 --- /dev/null +++ b/app/controllers/api/assemblies_controller.rb @@ -0,0 +1,47 @@ +module Api + class AssembliesController < ApplicationController + skip_before_action :verify_authenticity_token + before_action :set_assembly, only: %i[show update destroy] + def index + @assemblies = Assembly.all + render json: @assemblies, except: %i[created_at] + end + + def show + render json: @assembly + end + + def create + @assembly = Assembly.new(params_assembly) + + if @assembly.save + render json: @assembly, status: :created, except: %i[created_at] + else + render json: @assembly.errors.full_messages, status: :unprocessable_entity + end + end + + def update + if @assembly.update(params_assembly) + render json: @assembly, except: %i[created_at] + else + render json: @assembly.errors.full_messages, status: :unprocessable_entity + end + end + + def destroy + @assembly.destroy + head :no_content + end + + private + + def set_assembly + @assembly = Assembly.find(params[:id]) + end + + def params_assembly + params.require(:assembly).permit(:name, part_ids: [], book_ids: []) + end + end +end diff --git a/app/controllers/assemblies_controller.rb b/app/controllers/assemblies_controller.rb index 53ca4b0..068a920 100644 --- a/app/controllers/assemblies_controller.rb +++ b/app/controllers/assemblies_controller.rb @@ -1,78 +1,58 @@ class AssembliesController < ApplicationController - before_action :set_assembly, only: %i[ show edit update destroy ] - before_action :set_part_id_options, only: %i[ new show edit update destroy ] - before_action :set_book_id_options, only: %i[ new show edit update destroy ] + before_action :set_assembly, only: %i[show edit update destroy] + before_action :set_part_id_options, only: %i[new show edit update destroy] + before_action :set_book_id_options, only: %i[new show edit update destroy] - # GET /assemblies or /assemblies.json def index @assemblies = Assembly.all end - # GET /assemblies/1 or /assemblies/1.json - def show - end + def show; end - # GET /assemblies/new def new @assembly = Assembly.new end - # GET /assemblies/1/edit - def edit - end + def edit; end - # POST /assemblies or /assemblies.json def create @assembly = Assembly.new(assembly_params) - - respond_to do |format| - if @assembly.save - format.html { redirect_to assembly_url(@assembly), notice: "Assembly was successfully created." } - format.json { render :show, status: :created, location: @assembly } - else - format.html { render :new, status: :unprocessable_entity } - format.json { render json: @assembly.errors, status: :unprocessable_entity } - end + if @assembly.save + redirect_to assembly_url(@assembly), notice: 'Assembly was successfully created.' + else + render :new, status: :unprocessable_entity end end - # PATCH/PUT /assemblies/1 or /assemblies/1.json def update - respond_to do |format| - if @assembly.update(assembly_params) - format.html { redirect_to assembly_url(@assembly), notice: "Assembly was successfully updated." } - format.json { render :show, status: :ok, location: @assembly } - else - format.html { render :edit, status: :unprocessable_entity } - format.json { render json: @assembly.errors, status: :unprocessable_entity } - end + if @assembly.update(assembly_params) + redirect_to assembly_url(@assembly), notice: 'Assembly was successfully updated.' + else + render :edit, status: :unprocessable_entity end end - # DELETE /assemblies/1 or /assemblies/1.json def destroy @assembly.destroy - - respond_to do |format| - format.html { redirect_to assemblies_url, notice: "Assembly was successfully destroyed." } - format.json { head :no_content } - end + redirect_to assemblies_url, notice: 'Assembly was successfully destroyed.' end private - # Use callbacks to share common setup or constraints between actions. - def set_book_id_options - @book_id_options = Book.all.pluck(:published_at, :id) - end - def set_part_id_options - @part_id_options = Part.all.pluck(:part_number, :id) - end - def set_assembly - @assembly = Assembly.find(params[:id]) - end - # Only allow a list of trusted parameters through. - def assembly_params - params.require(:assembly).permit(:name, :part_id, :book_id) - end + def set_book_id_options + @book_id_options = Book.all.pluck(:published_at, :id) + end + + def set_part_id_options + @part_id_options = Part.all.pluck(:part_number, :id) + end + + def set_assembly + @assembly = Assembly.find(params[:id]) + end + + # Only allow a list of trusted parameters through. + def assembly_params + params.require(:assembly).permit(:name, :part_id, :book_id) + end end diff --git a/app/helpers/api/assemblies_helper.rb b/app/helpers/api/assemblies_helper.rb new file mode 100644 index 0000000..6f5f4b0 --- /dev/null +++ b/app/helpers/api/assemblies_helper.rb @@ -0,0 +1,2 @@ +module Api::AssembliesHelper +end diff --git a/app/models/assembly.rb b/app/models/assembly.rb index 8f06619..078f105 100644 --- a/app/models/assembly.rb +++ b/app/models/assembly.rb @@ -1,5 +1,6 @@ class Assembly < ApplicationRecord - has_many :part, through: :assembly_parts - belongs_to :book - has_many :assembly_parts + has_and_belongs_to_many :part + has_one :book + + validates :name, presence: true end diff --git a/config/routes.rb b/config/routes.rb index deac7cc..15a2514 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,5 +12,6 @@ resources :suppliers resources :accounts resources :parts + resources :assemblies end end diff --git a/db/migrate/20230714202258_create_assembly_parts.rb b/db/migrate/20230714202258_create_assemblies_parts.rb similarity index 62% rename from db/migrate/20230714202258_create_assembly_parts.rb rename to db/migrate/20230714202258_create_assemblies_parts.rb index 454bc45..8ab7a4f 100644 --- a/db/migrate/20230714202258_create_assembly_parts.rb +++ b/db/migrate/20230714202258_create_assemblies_parts.rb @@ -1,6 +1,6 @@ -class CreateAssemblyParts < ActiveRecord::Migration[7.0] +class CreateAssembliesParts < ActiveRecord::Migration[7.0] def change - create_table :assembly_parts do |t| + create_table :assemblies_parts do |t| t.references :assembly, null: false, foreign_key: true t.references :part, null: false, foreign_key: true diff --git a/db/seeds.rb b/db/seeds.rb index 606804a..6cfaf66 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,31 +5,31 @@ Account.destroy_all Part.destroy_all -#Create Author +# Create Author authors = [] 5.times do authors << Author.create(name: FFaker::Name.name, cpf: FFaker::IdentificationBR.cpf) end -#create Supplier +# create Supplier 5.times do Supplier.create(name: FFaker::Company.name, cnpj: FFaker::IdentificationBR.cnpj) end -#create Account +# create Account suppliers_ids = Supplier.pluck(:id) suppliers_ids.each do |supplier_id| Account.create(digit: rand(1..50), account_number: rand(10_000..99_999).to_s, supplier_id:) end -#create Part -part_name = ["Hard Cover", "Soft Cover", "Premium Cover", "Dust Jacket", "Comic Book Cover", - "Standard Size Page", "Large Print Page", "Deckle Edge", - "Glossy Page", "Premium Paper Page", - "Recycled Paper Page", "Gilded Edge", "Endpapers", - "Header", "Footer", "Bookmark", "Binding", "Corner Cut", - "Fold", "Creases"] +# create Part +part_name = ['Hard Cover', 'Soft Cover', 'Premium Cover', 'Dust Jacket', 'Comic Book Cover', + 'Standard Size Page', 'Large Print Page', 'Deckle Edge', + 'Glossy Page', 'Premium Paper Page', + 'Recycled Paper Page', 'Gilded Edge', 'Endpapers', + 'Header', 'Footer', 'Bookmark', 'Binding', 'Corner Cut', + 'Fold', 'Creases'] part_name.each_slice(4).with_index do |name_slice, index| name_slice.each do |name| @@ -37,3 +37,18 @@ supplier_id: suppliers_ids[index]) end end + +# create assembly +assemblies_descriptions = { + 'paperback' => ['Soft Cover', 'Standard Size Page', 'Acid-free Page', 'Comic Book Cover', 'Bookmark'], + 'hardcover' => ['Hard Cover', 'Dust Jacket', 'Acid-free Page', 'Large Print Page', 'Header'], + 'deluxe edition' => ['Premium Cover', 'Glossy Page', 'Endpapers', 'Premium Paper Page', 'Footer'], + "collector's edition" => ['Hard Cover', 'Gilded Edge', 'Endpapers', 'Recycled Paper Page', 'Binding'], + 'limited edition' => ['Premium Cover', 'Deckle Edge', 'Gilded Edge', 'Creases', 'Corner Cut', 'Fold'] +} + +assemblies_descriptions.each do |name, dscpts| + assembly_parts = dscpts.map { |dscpt| Part.find_by(name: dscpt) }.compact + assembly = Assembly.create(name:) + assembly_parts << assembly.part +end diff --git a/spec/models/assembly_part_spec.rb b/spec/models/assembly_part_spec.rb deleted file mode 100644 index 2c85cdd..0000000 --- a/spec/models/assembly_part_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'rails_helper' - -RSpec.describe AssemblyPart, type: :model do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/requests/api/assemblies_spec.rb b/spec/requests/api/assemblies_spec.rb new file mode 100644 index 0000000..a00048e --- /dev/null +++ b/spec/requests/api/assemblies_spec.rb @@ -0,0 +1,7 @@ +require 'rails_helper' + +RSpec.describe "Api::Assemblies", type: :request do + describe "GET /index" do + pending "add some examples (or delete) #{__FILE__}" + end +end