Skip to content

Commit 035b752

Browse files
authored
Merge pull request #25 from Desesperad0s/Tests-bdds
Tests bdds
2 parents 8d5335d + fc0622d commit 035b752

27 files changed

+678
-17
lines changed

CAMAAR_backend/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@
3232

3333
# Ignore master key for decrypting credentials and more.
3434
/config/master.key
35+
36+
/config/master.key
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
class DataImportController < ApplicationController
2+
before_action :authenticate_request
3+
before_action :authorize_admin, only: [:import]
4+
5+
# POST /import-data
6+
def import
7+
begin
8+
# Verificar e corrigir estrutura do banco de dados
9+
ensure_database_structure
10+
11+
classes_path = Rails.root.join('classes.json').to_s
12+
members_path = Rails.root.join('class_members.json').to_s
13+
14+
unless File.exist?(classes_path) && File.exist?(members_path)
15+
return render json: {
16+
success: false,
17+
message: "Arquivos não encontrados",
18+
details: {
19+
classes_path: classes_path,
20+
members_path: members_path,
21+
classes_exists: File.exist?(classes_path),
22+
members_exists: File.exist?(members_path)
23+
}
24+
}, status: :not_found
25+
end
26+
27+
classes_data = File.read(classes_path)
28+
members_data = File.read(members_path)
29+
30+
begin
31+
JSON.parse(classes_data)
32+
JSON.parse(members_data)
33+
rescue JSON::ParserError => e
34+
Rails.logger.error("Erro ao parsear JSON: #{e.message}")
35+
return render json: {
36+
success: false,
37+
message: "Arquivo JSON inválido",
38+
error: e.message
39+
}, status: :unprocessable_entity
40+
end
41+
42+
# Abordagem simplificada: ignorar classes_result pois estamos apenas criando usuários
43+
classes_result = {success: true, total_processed: 0, errors: []}
44+
Rails.logger.info("Ignorando processamento de disciplinas/turmas conforme solicitado")
45+
46+
# Processar apenas discentes e associá-los à turma ID 1
47+
discentes_result = JsonProcessorService.process_discentes(members_data)
48+
Rails.logger.info("Resultado do processamento de discentes: #{discentes_result.inspect}")
49+
50+
# Como ignoramos as classes, o sucesso depende apenas do processamento de discentes
51+
all_success = discentes_result[:success]
52+
all_errors = discentes_result[:errors] || []
53+
54+
if all_success
55+
render json: {
56+
success: true,
57+
message: "Dados importados com sucesso",
58+
stats: {
59+
users_processed: discentes_result[:total_processed],
60+
classes_processed: classes_result[:total_processed],
61+
turmas_processed: Turma.count
62+
}
63+
}, status: :ok
64+
else
65+
render json: {
66+
success: false,
67+
message: "Dados importados com erros",
68+
stats: {
69+
users_processed: discentes_result[:total_processed],
70+
classes_processed: classes_result[:total_processed],
71+
errors: all_errors
72+
}
73+
}, status: :ok
74+
end
75+
rescue => e
76+
# Registrar o erro completo no log para facilitar o diagnóstico
77+
Rails.logger.error("Erro na importação de dados: #{e.message}")
78+
Rails.logger.error("Backtrace: #{e.backtrace.join("\n")}")
79+
80+
render json: {
81+
success: false,
82+
message: "Erro ao processar importação",
83+
error: e.message,
84+
backtrace: e.backtrace.first(5)
85+
}, status: :internal_server_error
86+
end
87+
end
88+
89+
private
90+
91+
def authorize_admin
92+
unless @current_user && @current_user.admin?
93+
render json: { error: 'Acesso negado. Apenas administradores podem realizar esta operação.' }, status: :forbidden
94+
end
95+
end
96+
97+
def ensure_database_structure
98+
begin
99+
# Verificar se existe uma turma com ID 1
100+
turma = Turma.find_by(id: 1)
101+
102+
unless turma
103+
Rails.logger.warn("Não existe turma com ID 1. Verificando se existe alguma turma no sistema...")
104+
105+
# Verificar se existe alguma turma
106+
if Turma.count == 0
107+
Rails.logger.warn("Nenhuma turma encontrada no sistema. É necessário criar ao menos uma turma.")
108+
109+
# Verificar se existe alguma disciplina
110+
if Disciplina.count == 0
111+
Rails.logger.warn("Nenhuma disciplina encontrada. Criando disciplina padrão...")
112+
113+
# Verificar se existe algum departamento
114+
if Departamento.count == 0
115+
Rails.logger.warn("Nenhum departamento encontrado. Criando departamento padrão...")
116+
departamento = Departamento.create!(name: "Departamento de Ciência da Computação", code: "CIC")
117+
else
118+
departamento = Departamento.first
119+
end
120+
121+
# Criar disciplina padrão
122+
disciplina = Disciplina.create!(
123+
name: "Disciplina Padrão",
124+
departamento_id: departamento.id
125+
)
126+
127+
if ActiveRecord::Base.connection.column_exists?(:disciplinas, :code)
128+
disciplina.update_column(:code, "DISC-PADRAO")
129+
end
130+
else
131+
disciplina = Disciplina.first
132+
end
133+
134+
# Criar turma padrão com ID 1
135+
Rails.logger.warn("Criando turma padrão com ID 1...")
136+
turma = Turma.new(
137+
code: "T1",
138+
semester: "2025/1",
139+
time: "08:00",
140+
disciplina_id: disciplina.id
141+
)
142+
143+
# Forçar ID 1 (em ambiente de desenvolvimento apenas)
144+
turma.id = 1 if Rails.env.development?
145+
turma.save!
146+
147+
Rails.logger.info("Turma padrão criada com sucesso: #{turma.inspect}")
148+
else
149+
primeira_turma = Turma.first
150+
Rails.logger.warn("Usando a primeira turma disponível (ID: #{primeira_turma.id}) como padrão.")
151+
end
152+
else
153+
Rails.logger.info("Turma com ID 1 encontrada: #{turma.inspect}")
154+
end
155+
rescue => e
156+
Rails.logger.error("Erro ao verificar/criar turma padrão: #{e.message}")
157+
Rails.logger.error(e.backtrace.join("\n"))
158+
end
159+
end
160+
end

CAMAAR_backend/app/controllers/disciplinas_controller.rb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,6 @@ def create
3737
else
3838
render json: @disciplina.errors, status: :unprocessable_entity
3939

40-
41-
42-
4340
end
4441
end
4542

@@ -66,11 +63,11 @@ def destroy
6663
private
6764
# Use callbacks to share common setup or constraints between actions.
6865
def set_disciplina
69-
@disciplina = Disciplina.find(params.expect(:id))
66+
@disciplina = Disciplina.find(params.require(:id))
7067
end
7168

7269
# Only allow a list of trusted parameters through.
7370
def disciplina_params
74-
params.expect(disciplina: [ :name ])
71+
params.require(:disciplina).permit(:name, :code, :departamento_id)
7572
end
7673
end

CAMAAR_backend/app/controllers/turmas_controller.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ def show
1818
render json: @turma
1919
end
2020

21+
def find_by_code
22+
@turma = Turma.find_by(code: params[:code])
23+
if @turma
24+
render json: @turma, status: :ok
25+
else
26+
render json: { error: 'Turma não encontrada' }, status: :not_found
27+
end
28+
end
29+
2130
# GET /turmas/new
2231
def new
2332

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class UserMailer < ApplicationMailer
2+
def send_password_email
3+
@user = params[:user]
4+
mail(
5+
to: @user.email,
6+
subject: 'Bem-vindo ao sistema CAMAAR!'
7+
)
8+
end
9+
end
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
class JsonProcessorService
2+
def self.import_all_data
3+
begin
4+
# Carregar os arquivos JSON
5+
classes_path = Rails.root.join('classes.json')
6+
members_path = Rails.root.join('class_members.json')
7+
8+
# Verificar existência dos arquivos
9+
unless File.exist?(classes_path) && File.exist?(members_path)
10+
Rails.logger.error("Arquivos JSON não encontrados: #{classes_path}, #{members_path}")
11+
return {
12+
success: false,
13+
error: "Arquivos JSON não encontrados",
14+
class_members: { error: "Arquivo não encontrado", errors: [] },
15+
classes: { error: "Arquivo não encontrado", errors: [] }
16+
}
17+
end
18+
19+
# Ler os conteúdos dos arquivos
20+
classes_data = File.read(classes_path)
21+
members_data = File.read(members_path)
22+
23+
# Processar os dados
24+
classes_result = process_classes(classes_data)
25+
members_result = process_discentes(members_data)
26+
27+
# Verificar se houve erros em algum dos processos
28+
all_success = classes_result[:success] && members_result[:success]
29+
all_errors = classes_result[:errors] + members_result[:errors]
30+
31+
return {
32+
success: all_success,
33+
class_members: {
34+
total_processed: members_result[:total_processed],
35+
errors: members_result[:errors]
36+
},
37+
classes: {
38+
total_processed: classes_result[:total_processed],
39+
errors: classes_result[:errors]
40+
}
41+
}
42+
rescue StandardError => e
43+
Rails.logger.error("Erro na importação: #{e.message}\n#{e.backtrace.join("\n")}")
44+
return {
45+
success: false,
46+
error: e.message,
47+
class_members: { error: e.message, errors: [] },
48+
classes: { error: e.message, errors: [] }
49+
}
50+
end
51+
end
52+
53+
def self.process_classes(data)
54+
Rails.logger.info("Método process_classes chamado mas está desativado conforme solicitado")
55+
Rails.logger.info("Não estamos criando disciplinas/turmas, apenas usuários serão associados à turma ID 1")
56+
57+
return {success: true, total_processed: 0, errors: []}
58+
rescue JSON::ParserError => e
59+
Rails.logger.error("JSON inválido de classes: #{e.message}")
60+
raise "JSON inválido de classes: #{e.message}"
61+
end
62+
def self.process_discentes(data)
63+
parsed_data = JSON.parse(data)
64+
errors = []
65+
processed_users = 0
66+
67+
# Simplificar a abordagem - usar turma com ID 1
68+
begin
69+
turma = Turma.find(1)
70+
Rails.logger.info("Usando turma fixa com ID 1: #{turma.inspect}")
71+
rescue => e
72+
Rails.logger.error("Não foi possível encontrar a turma com ID 1: #{e.message}")
73+
# Não vamos criar turmas para simplificar, conforme solicitado
74+
return {success: false, total_processed: 0, errors: ["Turma com ID 1 não encontrada. Certifique-se de que existe ao menos uma turma no sistema."]}
75+
end
76+
77+
parsed_data.each do |turma_data|
78+
begin
79+
disciplina_code = turma_data['code']
80+
Rails.logger.info("Processando dados para disciplina com código: #{disciplina_code} - (apenas para registro, não criando disciplinas)")
81+
82+
# Não vamos mais verificar ou criar disciplinas/turmas
83+
# Comentado conforme solicitado:
84+
# Não criamos turmas, apenas usamos a turma ID 1
85+
86+
alunos = turma_data['dicente']
87+
88+
if alunos.nil? || !alunos.is_a?(Array)
89+
errors << "Formato inválido para alunos na turma com código: #{disciplina_code}"
90+
Rails.logger.error("Formato inválido para alunos na turma com código: #{disciplina_code}")
91+
next
92+
end
93+
94+
Rails.logger.info("Processando #{alunos.length} alunos")
95+
96+
alunos.each do |aluno_data|
97+
begin
98+
Rails.logger.info("Processando aluno: #{aluno_data.inspect}")
99+
100+
# Validar dados do aluno
101+
unless aluno_data['email'].present? && aluno_data['matricula'].present?
102+
errors << "Dados incompletos para aluno: #{aluno_data.inspect}"
103+
Rails.logger.error("Dados incompletos para aluno: #{aluno_data.inspect}")
104+
next
105+
end
106+
107+
# Verificar se o aluno já existe pelo email ou matrícula
108+
existing_user = User.find_by(email: aluno_data['email']) ||
109+
User.find_by(registration: aluno_data['matricula'])
110+
111+
if existing_user
112+
Rails.logger.info("Aluno já existe: #{existing_user.name} - #{existing_user.email}")
113+
# Associar à turma ID 1
114+
unless TurmaAluno.exists?(turma_id: turma.id, aluno_id: existing_user.id)
115+
TurmaAluno.create!(turma_id: turma.id, aluno_id: existing_user.id)
116+
Rails.logger.info("Aluno associado à turma ID 1")
117+
else
118+
Rails.logger.info("Aluno já associado à turma ID 1")
119+
end
120+
processed_users += 1
121+
next
122+
end
123+
124+
# Criar apenas usuário, não criar disciplinas/turmas (conforme solicitado)
125+
Rails.logger.info("Criando novo aluno: #{aluno_data['nome']} - #{aluno_data['email']}")
126+
127+
# Determinar o papel do usuário
128+
role = 'student'
129+
if aluno_data['ocupacao'].present?
130+
ocupacao = aluno_data['ocupacao'].to_s.downcase
131+
role = (ocupacao == 'dicente' || ocupacao == 'aluno' || ocupacao == 'estudante') ? 'student' :
132+
(ocupacao == 'professor' || ocupacao == 'docente') ? 'professor' : 'student'
133+
end
134+
135+
aluno = User.create!(
136+
name: aluno_data['nome'] || "Usuário #{aluno_data['matricula']}",
137+
major: aluno_data['curso'] || 'Não informado',
138+
registration: aluno_data['matricula'],
139+
email: aluno_data['email'],
140+
role: role,
141+
password: "padrao123"
142+
)
143+
144+
# Associar à turma ID 1
145+
if aluno.persisted?
146+
TurmaAluno.create!(
147+
turma_id: turma.id,
148+
aluno_id: aluno.id
149+
)
150+
Rails.logger.info("Aluno criado e associado à turma ID 1")
151+
processed_users += 1
152+
else
153+
errors << "Erro ao criar o usuário: #{aluno_data['email']} - #{aluno.errors.full_messages.join(', ')}"
154+
Rails.logger.error("Erro ao criar o usuário: #{aluno_data['email']} - #{aluno.errors.full_messages.join(', ')}")
155+
end
156+
rescue => e
157+
errors << "Erro ao processar aluno #{aluno_data['email'] || 'sem email'}: #{e.message}"
158+
Rails.logger.error("Erro ao processar aluno #{aluno_data['email'] || 'sem email'}: #{e.message}")
159+
Rails.logger.error(e.backtrace.join("\n"))
160+
end
161+
end
162+
rescue => e
163+
errors << "Erro ao processar dados de alunos: #{e.message}"
164+
Rails.logger.error("Erro ao processar dados de alunos: #{e.message}")
165+
Rails.logger.error(e.backtrace.join("\n"))
166+
end
167+
end
168+
169+
Rails.logger.info("Processamento de alunos concluído: #{processed_users} alunos processados, #{errors.length} erros")
170+
return {success: errors.empty?, total_processed: processed_users, errors: errors}
171+
rescue JSON::ParserError => e
172+
Rails.logger.error("JSON inválido de discentes: #{e.message}")
173+
Rails.logger.error(e.backtrace.join("\n"))
174+
raise "JSON inválido de discentes: #{e.message}"
175+
end
176+
end
File renamed without changes.
File renamed without changes.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9/voEjvPt07+6eQIRwlA3tv5S1WwjqJ6Ld4uegvUDUidLt6HhrQLNSaljarY+NxR5+PGjR8gTgTZtV+PjS3fIUqmlunHBSUwtbI/pYsk/vQK4lTpifGwEQRlJ9LVmOwv4x6ooFC8QCam25nwsc6EyzEH+awvb0vHVRXfY6aLiukTDf5wesEdfzVslb8IXAXHIdUwbWImm65MF9OGxgqVP+CDRph7QMQ3DfuP68W6c4tQRPCDzWslCrVVheZvIBr3w5cmjmLn94gasN61vPgnfl7pN5GKEuN0MyqLW0RI/cchbYzYbzKya1jiabafIxq3SDOdrAcYDNkbup42vySqhvRLsB9DuG1SJwp/+Kp6l9Bb55W26OTEqZL/5v+DXe8MpOO1XXlSE/RmF6d+7Efrj0gh12McSUXOzVyxvl+naMeZwENuNneZB1j4BNF4vttPcAX+watdAzdFh9LCqr+YEHN3o0wEsdz4bHflm436UiQLVshB8rUzty6S--dblzOpyMfpI1g9qb--QwENzZ104VzXiAiTg7Icuw==
1+
9g/N4od/DaJ6R6vOpcRJUHF0L1Hqe4Lvj6SS72GCIQXdoaplUN7sklZovow1lkNFk4lAReuw00B3Xi0V8rCWeLT9PSLg93ZG7z8SjxwRcoVsBhhvNZe7X7ydONi1aGKaNBYA2uzURo/pgaEVfZlnEWkp6Hfu0MMib8C2nfMwNNyiIDZeQjdh42PhzEA650ntvLeybvyXLqOmMxosyMcqRZ5A9TmeiSqgP1MDxGMG5WQwKYuLmxscNu/IJ6q4ZXSwXhUCvftgzGyyPUguvxhIGBsst96FbRhoyZUUcWcIEPSEArmeNnwjjADKc1KV5OOCkU/u1uq+2ABw3NCQaz9udtrUBYiGj7CVzE+UR9PNoVgRlyqGhofAOUQ8vsuqxNKj8dJzaI+no7qzeo/pJBKcljlSYPxGyZ5cUE1u6dn2JQyfOOG2J3DgzF8Uyj+tHCmMcsuXFuMxWZ3e9wsXY7hQJn7u48uAweESManJVUNut7Y3BW8YnW/SkBTu--H4LvunoE1tVWkcek--NUhCL3k73R8bX+PdhCHzNA==

0 commit comments

Comments
 (0)