Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
2f4ae24
📝 Instruções da Sprint pro Azul
valentinfp Aug 10, 2021
a444a69
✅ Remove necessidade do usuário ter um nome
valentinfp Aug 20, 2021
daa01b4
📝Incluída documentação do Insomnia (WiP)
valentinfp Aug 20, 2021
c5f6b2b
✨ Pode criar times com cargos
valentinfp Aug 20, 2021
62226fb
:bug: Fix Bug: only admin can create users
joaopedroazul Aug 31, 2021
2a29f4c
🐛 Atualiza metodo check role do member manager
dapeduu Sep 3, 2021
341065b
✨ Atualiza parametros das requisições de member
dapeduu Sep 3, 2021
812d796
🐛 Remove recursão de cargos e adiciona em times
dapeduu Sep 3, 2021
ba2f239
✨ Atualiza join_roles e leave_roles como arrays
dapeduu Sep 3, 2021
20c4fd3
Merge pull request #13 from cgr-system/feat/adicionar_multiplos_cargos
dapeduu Sep 3, 2021
a23fa85
:heavy_check_mark: Nova coluna Flag criada na tabela Role, validações…
joaopedroazul Sep 13, 2021
5bbde37
:bug: Fix-Bug: Corrigindo o bug na model role
joaopedroazul Sep 13, 2021
49611f3
:bug: Fix-Bug: Corrigindo o bug na model role again
joaopedroazul Sep 13, 2021
65e959b
✅ Coloca factories em arquivos individuais
valentinfp Sep 15, 2021
eb4ecd9
✅ Refatoração dos testes do controller de Members
valentinfp Sep 15, 2021
48f38ba
✅ Teste de requisição de criar membro com um cargo
valentinfp Sep 15, 2021
86616eb
🩹 Adiciona dependência de member_roles na model Role
valentinfp Sep 21, 2021
e43ed69
✅ MembersController: testes de #update adicionando e removendo cargos
valentinfp Sep 21, 2021
57e74cc
✅ MembersController - Casos de erro
valentinfp Sep 21, 2021
3efc122
✅ MembersController: Esboça os testes restantes
valentinfp Sep 21, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/controllers/members_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def show
# POST /members
def create
result = MemberManager::Registrate.call(member_params, opt_params)


if result.success?
render json: result.member, include: [:teams, :roles], status: :created, location: result.member
Expand Down Expand Up @@ -63,7 +64,7 @@ def member_params
end

def opt_params
params.permit(:hard_delete, roles: [:id, :leave_role])
params.permit(:hard_delete, join_roles: [], leave_roles: [])
end

end
19 changes: 15 additions & 4 deletions app/controllers/teams_controller.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
class TeamsController < ApplicationController
before_action :set_team, only: [:show, :update, :destroy]

include TeamManager

# GET /teams
def index
@teams = Team.all
Expand All @@ -15,12 +17,12 @@ def show

# POST /teams
def create
@team = Team.new(team_params)
result = TeamManager::Registrate.call(team_params, roles_params)

if @team.save
render json: @team, status: :created, location: @team
if result.success?
render json: result.team, status: :created, location: result.team
else
render json: @team.errors, status: :unprocessable_entity
render json: result.errors, status: :unprocessable_entity
end
end

Expand Down Expand Up @@ -52,4 +54,13 @@ def set_team
def team_params
params.require(:team).permit(:name, :initials)
end

def roles_params
roles = params.fetch(roles, [])
roles_params = []
roles.each do |r|
roles_params += r.permit(:name, :leader)
end
roles_params
end
end
13 changes: 8 additions & 5 deletions app/controllers/users_controller.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
class UsersController < ApplicationController
before_action :set_user, only: [:show, :update, :destroy]
before_action :authenticate_user, only: [:update, :destroy]
before_action :authenticate_user, only: [:create, :update, :destroy]

include UserManager

Expand All @@ -16,8 +16,11 @@ def show

# POST /users
def create
result = UserManager::Registrate.call(user_params, member_params)

if @current_user.is_admin?
result = UserManager::Registrate.call(user_params, member_params)
else
result = false
end
if result.success?
render json: result.user, include: [:member], status: :created, location: result.user
else
Expand Down Expand Up @@ -57,8 +60,8 @@ def user_params

def member_params
member_params = {
member: params.fetch(:member, {}).permit(:name, :deleted_at),
options: params.permit(:role_id, :leave_role, :hard_delete)
member: params.fetch(:member, {}).permit(:name),
options: params.permit(:hard_delete, join_roles: [], leave_roles: [])
}
member_params ? member_params : nil

Expand Down
10 changes: 10 additions & 0 deletions app/models/member.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ def join_role(role_id)
MemberRole.find_or_create_by!({member_id: self.id, role_id: role_id})
end

def join_roles(role_ids)
join_role(role_ids)
end

def leave_role(role_id)
relation = MemberRole.where({member_id: self.id, role_id: role_id})
relation = relation.first
Expand All @@ -20,4 +24,10 @@ def leave_role(role_id)
end
end

def leave_roles(role_ids)
leave_role(role_ids)
end



end
8 changes: 5 additions & 3 deletions app/models/role.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
class Role < ApplicationRecord
has_many :member_roles
has_many :member_roles, dependent: :destroy
has_many :members, through: :member_roles
has_many :children, class_name: 'Role', foreign_key: 'parent_id'
belongs_to :team
belongs_to :parent, class_name: 'Role', optional: true

# Adicionar flag que identifica se o cargo é de um 'leader'
# Dica: Criar migration para adicionar atributo 'leader' do tipo 'boolean'

include SoftDeletable

validates :name, presence: true
validates :team, presence: true

end
13 changes: 13 additions & 0 deletions app/models/team.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,22 @@
class Team < ApplicationRecord
has_many :members, through: :roles
has_many :roles, dependent: :destroy

belongs_to :parent, class_name: 'Team', optional: true
has_many :children, class_name: 'Team', foreign_key: 'parent_id'

include SoftDeletable

validates :name, uniqueness: true, presence: true
# Validar se apenas um cargo (ou nenhum) tem a flag de 'leader'
# Dica: Usar método 'validate' como:
#
# validate :has_a_single_leader
#
# private
#
# def has_a single_leader
# errors.add(:roles, 'Não pode ter mais de um líder') unless # Seu código aqui
# end

end
3 changes: 1 addition & 2 deletions app/models/user.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
class User < ApplicationRecord
has_secure_password
has_one :member

validates :name, presence: true

validates :email, presence: true, uniqueness: true

def is_admin?
Expand Down
24 changes: 24 additions & 0 deletions app/services/member_manager/member_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
module MemberManager
class MemberService < ApplicationService

protected

def check_roles
@options[:join_roles] ||= []
@options[:leave_roles] ||= []

return @member.join_role(@defaults[:role].id) unless @options[:join_roles].any? || @options[:leave_roles].any?

@options[:join_roles].each do |role_id|
@member.join_roles(role_id)
end

@options[:leave_roles].each do |role_id|
@member.leave_roles(role_id)
end

@member.reload
end

end
end
12 changes: 2 additions & 10 deletions app/services/member_manager/registrate.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module MemberManager
class Registrate < ApplicationService
class Registrate < MemberService

attr_reader :member, :options

Expand All @@ -14,7 +14,7 @@ def execute
return OpenStruct.new( success?: false,
member: nil,
errors: @member.errors) unless @member.save
check_role
check_roles
OpenStruct.new(success?: true, member: @member, errors: nil)
end

Expand All @@ -26,13 +26,5 @@ def set_defaults
@defaults[:role] = Role.find_or_create_by({name: 'Visitante', team: @defaults[:team]})
end

def check_role
return @member.join_role(@defaults[:role].id) unless @options[:roles]

@options[:roles].each do |role|
@member.join_role(role[:id])
end
end

end
end
12 changes: 1 addition & 11 deletions app/services/member_manager/update.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
module MemberManager
class Update < ApplicationService

class Update < MemberService
attr_reader :current_user, :member, :member_params

def initialize(current_user, member, params = {}, options = {})
Expand Down Expand Up @@ -39,15 +38,6 @@ def set_defaults
@defaults[:role] = Role.find_or_create_by({name: 'Visitante', team: @defaults[:team]})
end

def check_roles
return @member.join_role(@defaults[:role].id) unless @options[:roles]

@options[:roles].each do |role|
role[:leave_role] ? @member.leave_role(role[:id]) : @member.join_role(role[:id])
end
@member.reload
end

# Para atualizar as informações de um membro, o usuário deve ser admin
# ou o próprio membro que está sendo editado.
def can_update?
Expand Down
29 changes: 29 additions & 0 deletions app/services/team_manager/registrate.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
module TeamManager
class Registrate < ApplicationService

def initialize(team_params = {}, roles_params = [])
@team = Team.new(team_params)
@roles_params = roles_params
end

def execute
return OpenStruct.new( success?: false,
team: nil,
errors: @team.errors) unless create_team
OpenStruct.new(success?: true, team: @team, errors: nil)
end

private

def create_team
return unless @team.save
unless @roles_params.empty?
@roles_params.each do |role_params|
Role.create(name: role_params[:name], team: @team)
end
@team.reload
end
@team
end
end
end
1 change: 1 addition & 0 deletions db/migrate/20200722172237_create_teams.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
class CreateTeams < ActiveRecord::Migration[5.2]
def change
create_table :teams do |t|
t.belongs_to :parent, foreign_key: { to_table: :teams }
t.string :name
t.string :initials

Expand Down
1 change: 0 additions & 1 deletion db/migrate/20200722172245_create_roles.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
class CreateRoles < ActiveRecord::Migration[5.2]
def change
create_table :roles do |t|
t.belongs_to :parent, foreign_key: { to_table :roles }
t.references :team, foreign_key: true
t.string :name

Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20210913205929_add_flag_to_roles.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddFlagToRoles < ActiveRecord::Migration[6.1]
def change
add_column :roles, :leader, :boolean
end
end
16 changes: 10 additions & 6 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
# This file is the source Rails uses to define your schema when running `bin/rails
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2020_08_30_155133) do
ActiveRecord::Schema.define(version: 2021_09_13_205929) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand All @@ -36,11 +36,14 @@
end

create_table "roles", force: :cascade do |t|
t.bigint "parent_id"
t.bigint "team_id"
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "deleted_at"
t.boolean "leader"
t.index ["parent_id"], name: "index_roles_on_parent_id"
t.index ["team_id"], name: "index_roles_on_team_id"
end

Expand All @@ -64,5 +67,6 @@
add_foreign_key "member_roles", "members"
add_foreign_key "member_roles", "roles"
add_foreign_key "members", "users"
add_foreign_key "roles", "roles", column: "parent_id"
add_foreign_key "roles", "teams"
end
24 changes: 0 additions & 24 deletions spec/factories.rb

This file was deleted.

6 changes: 6 additions & 0 deletions spec/factories/member.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FactoryBot.define do
factory :member do
name { "Neiralay" }
roles { [] }
end
end
6 changes: 6 additions & 0 deletions spec/factories/role.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FactoryBot.define do
factory :role do
name { "Consultor de Talentos"}
team
end
end
6 changes: 6 additions & 0 deletions spec/factories/team.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FactoryBot.define do
factory :team do
name { "Núcleo de Talentos" }
initials { "NUT" }
end
end
Loading