Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Fábrica de Software III - 2024-2
Agendamento de salas
Commits
74ba07e5
Commit
74ba07e5
authored
4 months ago
by
Kelve Oliveira
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '124-bud-fix' into 'develop'
Resolve "bug fix" See merge request
!99
parents
909cc929
bd6454a0
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
584 additions
and
583 deletions
+584
-583
src/services/reservaServices.js
src/services/reservaServices.js
+187
-187
src/testes/integracao/ensalamento.spec.js
src/testes/integracao/ensalamento.spec.js
+87
-86
src/testes/unitario/reserva.spec.js
src/testes/unitario/reserva.spec.js
+310
-310
No files found.
src/services/reservaServices.js
View file @
74ba07e5
import
ReservaSchema
from
'
../schema/reservaSchema.js
'
;
import
ReservaRepository
from
'
../repository/reservaRepository.js
'
;
import
SalaRepository
from
'
../repository/salaRepository.js
'
;
import
UsuarioRepository
from
'
../repository/usuarioRepository.js
'
;
class
ReservaServices
{
static
async
listar
(
filtro
,
page
=
1
,
limit
=
10
)
{
const
filtroValidado
=
ReservaSchema
.
CamposReservaOptional
.
parse
(
filtro
)
//para pegar apenas um dia especifico
if
(
filtroValidado
.
dia
)
{
const
[
dia
,
mes
,
ano
]
=
filtroValidado
.
dia
.
split
(
'
-
'
).
map
(
Number
);
// Divide a data e converte para números
const
dataInicio
=
new
Date
(
ano
,
mes
-
1
,
dia
,
0
,
0
,
0
);
// Início do dia
const
dataFim
=
new
Date
(
ano
,
mes
-
1
,
dia
,
23
,
59
,
59
,
999
);
// Fim do dia
// Ajustar o filtro para incluir as reservas daquele dia
filtroValidado
.
hora_inicio
=
{
gte
:
dataInicio
};
// Reservas a partir do início do dia
filtroValidado
.
hora_fim
=
{
lte
:
dataFim
};
// Reservas até o fim do dia
delete
filtroValidado
.
dia
}
const
response
=
await
ReservaRepository
.
lista
(
filtroValidado
,
page
,
limit
)
return
response
}
static
async
inserir
(
data
)
{
const
dataValidada
=
ReservaSchema
.
CamposReserva
.
parse
(
data
)
//verificar se ids de referencia existe
const
sala
=
await
SalaRepository
.
findById
(
dataValidada
.
id_sala
)
if
(
!
sala
)
{
throw
{
error
:
true
,
message
:
`Não existe sala com este id:
${
dataValidada
.
id_sala
}
`
,
code
:
400
}
}
const
usuario
=
await
UsuarioRepository
.
findById
(
dataValidada
.
id_usuario
)
if
(
!
usuario
)
{
throw
{
error
:
true
,
message
:
`Não existe um usuário com este id:
${
dataValidada
.
id_usuario
}
em (id_usuario)`
,
code
:
400
}
}
const
idReservante
=
await
UsuarioRepository
.
findById
(
dataValidada
.
id_reservante
)
if
(
!
idReservante
)
{
throw
{
error
:
true
,
message
:
`Não existe um usuário com este id:
${
dataValidada
.
id_reservante
}
em (id_reservante)`
,
code
:
400
}
}
// Buscar reservas onde o horário de início ou fim está dentro do intervalo de outra reserva
const
reservasConflitantes
=
await
ReservaRepository
.
lista
({
OR
:
[
{
hora_inicio
:
{
lte
:
dataValidada
.
hora_fim
},
hora_fim
:
{
gte
:
dataValidada
.
hora_inicio
}
},
{
hora_inicio
:
{
gte
:
dataValidada
.
hora_inicio
,
lte
:
dataValidada
.
hora_fim
}
}
]
});
// Verifica se existe algum conflito
if
(
reservasConflitantes
.
data
.
length
>
0
)
{
throw
{
error
:
true
,
message
:
`Conflito de horário: já existe uma reserva no período fornecido`
,
code
:
400
};
}
const
response
=
await
ReservaRepository
.
create
(
dataValidada
)
return
response
}
static
async
atualizar
(
id
,
data
)
{
const
idValidado
=
ReservaSchema
.
IdReserva
.
parse
(
id
)
const
dataValidada
=
ReservaSchema
.
CamposReservaOptional
.
parse
(
data
)
const
reserva
=
await
ReservaRepository
.
findById
(
idValidado
.
id
)
if
(
!
reserva
)
{
throw
{
error
:
true
,
message
:
`Não existe nenhuma reserva com este id:
${
idValidado
.
id
}
`
,
code
:
400
}
}
//verificar se ids de referencia existe
if
(
dataValidada
.
id_sala
)
{
const
sala
=
await
SalaRepository
.
findById
(
dataValidada
.
id_sala
)
if
(
!
sala
)
{
throw
{
error
:
true
,
message
:
`Não existe sala com este id:
${
dataValidada
.
id_sala
}
`
,
code
:
400
}
}
}
if
(
dataValidada
.
id_usuario
)
{
const
usuario
=
await
UsuarioRepository
.
findById
(
dataValidada
.
id_usuario
)
if
(
!
usuario
)
{
throw
{
error
:
true
,
message
:
`Não existe um usuário com este id:
${
dataValidada
.
id_usuario
}
em (id_usuario)`
,
code
:
400
}
}
}
if
(
dataValidada
.
id_reservante
)
{
const
idReservante
=
await
UsuarioRepository
.
findById
(
dataValidada
.
id_reservante
)
if
(
!
idReservante
)
{
throw
{
error
:
true
,
message
:
`Não existe um usuário com este id:
${
dataValidada
.
id_reservante
}
em (id_reservante)`
,
code
:
400
}
}
}
// Buscar reservas onde o horário de início ou fim está dentro do intervalo de outra reserva
const
reservasConflitantes
=
await
ReservaRepository
.
lista
({
OR
:
[
{
hora_inicio
:
{
lte
:
dataValidada
.
hora_fim
},
hora_fim
:
{
gte
:
dataValidada
.
hora_inicio
}
},
{
hora_inicio
:
{
gte
:
dataValidada
.
hora_inicio
,
lte
:
dataValidada
.
hora_fim
}
}
]
});
// Verifica se existe algum conflito
if
(
reservasConflitantes
.
length
>
0
)
{
if
(
reservasConflitantes
[
0
].
id
!=
idValidado
.
id
)
{
throw
{
error
:
true
,
message
:
`Conflito de horário: já existe uma reserva no período fornecido`
,
code
:
400
}
}
}
const
response
=
await
ReservaRepository
.
update
(
idValidado
.
id
,
dataValidada
)
return
response
}
static
async
excluir
(
id
)
{
const
idValidado
=
ReservaSchema
.
IdReserva
.
parse
(
id
)
const
reserva
=
await
ReservaRepository
.
findById
(
idValidado
.
id
)
if
(
!
reserva
)
{
throw
{
error
:
true
,
message
:
`Não existe nenhuma reserva com este id:
${
idValidado
.
id
}
`
,
code
:
400
}
}
const
response
=
await
ReservaRepository
.
delete
(
idValidado
.
id
)
return
response
}
}
import
ReservaSchema
from
'
../schema/reservaSchema.js
'
;
import
ReservaRepository
from
'
../repository/reservaRepository.js
'
;
import
SalaRepository
from
'
../repository/salaRepository.js
'
;
import
UsuarioRepository
from
'
../repository/usuarioRepository.js
'
;
class
ReservaServices
{
static
async
listar
(
filtro
,
page
=
1
,
limit
=
10
)
{
const
filtroValidado
=
ReservaSchema
.
CamposReservaOptional
.
parse
(
filtro
)
//para pegar apenas um dia especifico
if
(
filtroValidado
.
dia
)
{
const
[
dia
,
mes
,
ano
]
=
filtroValidado
.
dia
.
split
(
'
-
'
).
map
(
Number
);
// Divide a data e converte para números
const
dataInicio
=
new
Date
(
ano
,
mes
-
1
,
dia
,
0
,
0
,
0
);
// Início do dia
const
dataFim
=
new
Date
(
ano
,
mes
-
1
,
dia
,
23
,
59
,
59
,
999
);
// Fim do dia
// Ajustar o filtro para incluir as reservas daquele dia
filtroValidado
.
hora_inicio
=
{
gte
:
dataInicio
};
// Reservas a partir do início do dia
filtroValidado
.
hora_fim
=
{
lte
:
dataFim
};
// Reservas até o fim do dia
delete
filtroValidado
.
dia
}
const
response
=
await
ReservaRepository
.
lista
(
filtroValidado
,
page
,
limit
)
return
response
}
static
async
inserir
(
data
)
{
const
dataValidada
=
ReservaSchema
.
CamposReserva
.
parse
(
data
)
//verificar se ids de referencia existe
const
sala
=
await
SalaRepository
.
findById
(
dataValidada
.
id_sala
)
if
(
!
sala
)
{
throw
{
error
:
true
,
message
:
`Não existe sala com este id:
${
dataValidada
.
id_sala
}
`
,
code
:
400
}
}
const
usuario
=
await
UsuarioRepository
.
findById
(
dataValidada
.
id_usuario
)
if
(
!
usuario
)
{
throw
{
error
:
true
,
message
:
`Não existe um usuário com este id:
${
dataValidada
.
id_usuario
}
em (id_usuario)`
,
code
:
400
}
}
const
idReservante
=
await
UsuarioRepository
.
findById
(
dataValidada
.
id_reservante
)
if
(
!
idReservante
)
{
throw
{
error
:
true
,
message
:
`Não existe um usuário com este id:
${
dataValidada
.
id_reservante
}
em (id_reservante)`
,
code
:
400
}
}
// Buscar reservas onde o horário de início ou fim está dentro do intervalo de outra reserva
const
reservasConflitantes
=
await
ReservaRepository
.
lista
({
OR
:
[
{
hora_inicio
:
{
lte
:
dataValidada
.
hora_fim
},
hora_fim
:
{
gte
:
dataValidada
.
hora_inicio
}
},
{
hora_inicio
:
{
gte
:
dataValidada
.
hora_inicio
,
lte
:
dataValidada
.
hora_fim
}
}
]
});
// Verifica se existe algum conflito
if
(
reservasConflitantes
.
data
.
length
>
0
)
{
throw
{
error
:
true
,
message
:
`Conflito de horário: já existe uma reserva no período fornecido`
,
code
:
400
};
}
const
response
=
await
ReservaRepository
.
create
(
dataValidada
)
return
response
}
static
async
atualizar
(
id
,
data
)
{
const
idValidado
=
ReservaSchema
.
IdReserva
.
parse
(
id
)
const
dataValidada
=
ReservaSchema
.
CamposReservaOptional
.
parse
(
data
)
const
reserva
=
await
ReservaRepository
.
findById
(
idValidado
.
id
)
if
(
!
reserva
)
{
throw
{
error
:
true
,
message
:
`Não existe nenhuma reserva com este id:
${
idValidado
.
id
}
`
,
code
:
400
}
}
//verificar se ids de referencia existe
if
(
dataValidada
.
id_sala
)
{
const
sala
=
await
SalaRepository
.
findById
(
dataValidada
.
id_sala
)
if
(
!
sala
)
{
throw
{
error
:
true
,
message
:
`Não existe sala com este id:
${
dataValidada
.
id_sala
}
`
,
code
:
400
}
}
}
if
(
dataValidada
.
id_usuario
)
{
const
usuario
=
await
UsuarioRepository
.
findById
(
dataValidada
.
id_usuario
)
if
(
!
usuario
)
{
throw
{
error
:
true
,
message
:
`Não existe um usuário com este id:
${
dataValidada
.
id_usuario
}
em (id_usuario)`
,
code
:
400
}
}
}
if
(
dataValidada
.
id_reservante
)
{
const
idReservante
=
await
UsuarioRepository
.
findById
(
dataValidada
.
id_reservante
)
if
(
!
idReservante
)
{
throw
{
error
:
true
,
message
:
`Não existe um usuário com este id:
${
dataValidada
.
id_reservante
}
em (id_reservante)`
,
code
:
400
}
}
}
// Buscar reservas onde o horário de início ou fim está dentro do intervalo de outra reserva
const
reservasConflitantes
=
await
ReservaRepository
.
lista
({
OR
:
[
{
hora_inicio
:
{
lte
:
dataValidada
.
hora_fim
},
hora_fim
:
{
gte
:
dataValidada
.
hora_inicio
}
},
{
hora_inicio
:
{
gte
:
dataValidada
.
hora_inicio
,
lte
:
dataValidada
.
hora_fim
}
}
]
});
// Verifica se existe algum conflito
if
(
reservasConflitantes
.
data
.
length
>
0
)
{
if
(
reservasConflitantes
.
data
[
0
].
id
!=
idValidado
.
id
)
{
throw
{
error
:
true
,
message
:
`Conflito de horário: já existe uma reserva no período fornecido`
,
code
:
400
}
}
}
const
response
=
await
ReservaRepository
.
update
(
idValidado
.
id
,
dataValidada
)
return
response
}
static
async
excluir
(
id
)
{
const
idValidado
=
ReservaSchema
.
IdReserva
.
parse
(
id
)
const
reserva
=
await
ReservaRepository
.
findById
(
idValidado
.
id
)
if
(
!
reserva
)
{
throw
{
error
:
true
,
message
:
`Não existe nenhuma reserva com este id:
${
idValidado
.
id
}
`
,
code
:
400
}
}
const
response
=
await
ReservaRepository
.
delete
(
idValidado
.
id
)
return
response
}
}
export
default
ReservaServices
;
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/testes/integracao/ensalamento.spec.js
View file @
74ba07e5
import
request
from
'
supertest
'
;
import
app
from
'
../../app
'
;
describe
(
'
Teste de Integração Reserva
'
,
()
=>
{
const
reservas
=
[
{
"
id_sala
"
:
1
,
"
id_usuario
"
:
1
,
"
turma
"
:
"
2ºB Eletrônica
"
,
"
hora_inicio
"
:
"
2024-05-02T09:00:00.000Z
"
,
"
hora_fim
"
:
"
2024-05-02T11:50:00.000Z
"
,
"
descricao
"
:
"
Prática de laboratório
"
,
"
id_reservante
"
:
1
},
{
"
id_sala
"
:
1
,
"
id_usuario
"
:
1
,
"
turma
"
:
"
3ºC Mecatrônica
"
,
"
hora_inicio
"
:
"
2024-05-03T14:00:00.000Z
"
,
"
hora_fim
"
:
"
2024-05-03T16:50:00.000Z
"
,
"
descricao
"
:
"
Aula teórica
"
,
"
id_reservante
"
:
8
},
{
"
id_sala
"
:
1
,
"
id_usuario
"
:
1
,
"
turma
"
:
"
1ºD Informática
"
,
"
hora_inicio
"
:
"
2024-05-04T10:00:00.000Z
"
,
"
hora_fim
"
:
"
2024-05-04T12:50:00.000Z
"
,
"
descricao
"
:
"
Exercícios práticos
"
,
"
id_reservante
"
:
6
}
];
let
token
;
beforeAll
(
async
()
=>
{
const
loginResponse
=
await
request
(
app
)
.
post
(
'
/login
'
)
.
send
({
siape
:
'
248613
'
,
senha
:
'
Senha123@
'
});
token
=
loginResponse
.
body
.
data
.
token
;
});
describe
(
'
POST /ensalamento
'
,
()
=>
{
it
(
'
Deve criar múltiplas reservas com sucesso
'
,
async
()
=>
{
const
body
=
{
ensalamento
:
reservas
,
sala
:
4
,
dataInicio
:
"
2025-02-07T13:00:00.000Z
"
,
dataFim
:
"
2025-05-03T08:50:00.000Z
"
};
const
response
=
await
request
(
app
)
.
post
(
'
/ensalamento
'
)
.
set
(
'
Authorization
'
,
`Bearer
${
token
}
`
)
.
send
(
body
);
expect
(
response
.
statusCode
).
toBe
(
201
);
expect
(
response
.
body
).
toHaveProperty
(
'
message
'
,
'
Ensalamento criado com sucesso!
'
);
expect
(
response
.
body
).
toMatchObject
({
code
:
201
,
error
:
false
,
message
:
'
Ensalamento criado com sucesso!
'
,
data
:
{
count
:
39
}
});
});
it
(
'
Deve retornar erro 400 se faltar campo obrigatório
'
,
async
()
=>
{
const
bodyIncompleto
=
{
ensalamento
:
{
tipo_invalido
:
'
deve ser um array
'
},
dataInicio
:
"
2025-02-07T13:00:00.000Z
"
,
dataFim
:
"
2025-05-03T08:50:00.000Z
"
};
const
response
=
await
request
(
app
)
.
post
(
'
/ensalamento
'
)
.
set
(
'
Authorization
'
,
`Bearer
${
token
}
`
)
.
send
(
bodyIncompleto
);
expect
(
response
.
statusCode
).
toBe
(
400
);
expect
(
response
.
body
).
toHaveProperty
(
'
message
'
,
'
O campo Ensalamento deve ser do typo array e não pode esta vasio
'
);
});
});
});
import
request
from
'
supertest
'
;
import
app
from
'
../../app
'
;
describe
(
'
Teste de Integração Reserva
'
,
()
=>
{
const
reservas
=
[
{
"
id_sala
"
:
1
,
"
id_usuario
"
:
9
,
"
turma
"
:
"
2ºB Eletrônica
"
,
"
hora_inicio
"
:
"
2024-05-02T09:00:00.000Z
"
,
"
hora_fim
"
:
"
2024-05-02T11:50:00.000Z
"
,
"
descricao
"
:
"
Prática de laboratório
"
,
"
id_reservante
"
:
8
},
{
"
id_sala
"
:
1
,
"
id_usuario
"
:
9
,
"
turma
"
:
"
3ºC Mecatrônica
"
,
"
hora_inicio
"
:
"
2024-05-03T14:00:00.000Z
"
,
"
hora_fim
"
:
"
2024-05-03T16:50:00.000Z
"
,
"
descricao
"
:
"
Aula teórica
"
,
"
id_reservante
"
:
8
},
{
"
id_sala
"
:
1
,
"
id_usuario
"
:
9
,
"
turma
"
:
"
1ºD Informática
"
,
"
hora_inicio
"
:
"
2024-05-04T10:00:00.000Z
"
,
"
hora_fim
"
:
"
2024-05-04T12:50:00.000Z
"
,
"
descricao
"
:
"
Exercícios práticos
"
,
"
id_reservante
"
:
8
}
];
let
token
;
beforeAll
(
async
()
=>
{
const
loginResponse
=
await
request
(
app
)
.
post
(
'
/login
'
)
.
send
({
siape
:
'
248613
'
,
senha
:
'
Senha123@
'
});
token
=
loginResponse
.
body
.
data
.
token
;
});
describe
(
'
POST /ensalamento
'
,
()
=>
{
it
(
'
Deve criar múltiplas reservas com sucesso
'
,
async
()
=>
{
const
body
=
{
ensalamento
:
reservas
,
sala
:
4
,
dataInicio
:
"
2025-02-07T13:00:00.000Z
"
,
dataFim
:
"
2025-05-03T08:50:00.000Z
"
};
const
response
=
await
request
(
app
)
.
post
(
'
/ensalamento
'
)
.
set
(
'
Authorization
'
,
`Bearer
${
token
}
`
)
.
send
(
body
);
console
.
log
(
response
);
// expect(response.statusCode).toBe(201);
expect
(
response
.
body
).
toHaveProperty
(
'
message
'
,
'
Ensalamento criado com sucesso!
'
);
expect
(
response
.
body
).
toMatchObject
({
code
:
201
,
error
:
false
,
message
:
'
Ensalamento criado com sucesso!
'
,
data
:
{
count
:
39
}
});
});
it
(
'
Deve retornar erro 400 se faltar campo obrigatório
'
,
async
()
=>
{
const
bodyIncompleto
=
{
ensalamento
:
{
tipo_invalido
:
'
deve ser um array
'
},
dataInicio
:
"
2025-02-07T13:00:00.000Z
"
,
dataFim
:
"
2025-05-03T08:50:00.000Z
"
};
const
response
=
await
request
(
app
)
.
post
(
'
/ensalamento
'
)
.
set
(
'
Authorization
'
,
`Bearer
${
token
}
`
)
.
send
(
bodyIncompleto
);
expect
(
response
.
statusCode
).
toBe
(
400
);
expect
(
response
.
body
).
toHaveProperty
(
'
message
'
,
'
O campo Ensalamento deve ser do typo array e não pode esta vasio
'
);
});
});
});
This diff is collapsed.
Click to expand it.
src/testes/unitario/reserva.spec.js
View file @
74ba07e5
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment