Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
d873f05
Publicação do DER e do scriptDDL
GustHenrique May 13, 2022
169948d
Atualização do DER
GustHenrique May 13, 2022
296fc1e
Alteração definitiva no scriptDDL e no DER
GustHenrique May 15, 2022
d417ca5
Criação da REST api e atualização do README.md com novas instruções
GustHenrique May 15, 2022
f76caae
Ajuste na API para o CRUD de cursos
GustHenrique May 16, 2022
ba69810
Inicio da construção do front end com angular
GustHenrique May 16, 2022
8971c31
Criação do footer e do header
GustHenrique May 16, 2022
8de949b
Criação da pagina de login e adicionando o bootstrap 5
GustHenrique May 16, 2022
71b7d78
Adicionando a tela de listagem dos cursos
GustHenrique May 16, 2022
c7be75d
Criação da tela de CRUD dos cursos
GustHenrique May 16, 2022
6e52ceb
Configurando as rotas
GustHenrique May 16, 2022
50f4c99
Estilizando de maneira global e adicionando uma nova fonte
GustHenrique May 16, 2022
a17faf0
Criação do service e da interface Curso
GustHenrique May 16, 2022
8d88d6d
Colocando a função de login
GustHenrique May 16, 2022
2a53afe
Criação do proxy para a comunicação da API com o front-end
GustHenrique May 16, 2022
7428c1a
Ajustes de CORS e PATHs
GustHenrique May 16, 2022
69be380
Exclusão de services e proxy mal sucedido
GustHenrique May 16, 2022
7463011
Criação da interface Login
GustHenrique May 16, 2022
b6f48cf
Ajuste nas rotas
GustHenrique May 16, 2022
a702f8d
Adicionando rotas e fazendo a ligação entre o back-end com o front-end
GustHenrique May 17, 2022
8b42257
Aplicando a API e realizando a interação CREATE no banco de dados
GustHenrique May 17, 2022
00206f0
Conexão com beck-end LOGIN via POST
GustHenrique May 17, 2022
e0e2ab3
removendo materials
GustHenrique May 17, 2022
a1fe74c
Ajuste de sintaxe do banco de dados
GustHenrique May 17, 2022
52cc29b
Ajuste de rotas e criação do delete
GustHenrique May 17, 2022
e6f73ab
Login finalizado e criação de um botçao RETORNAR a lista de cursos
GustHenrique May 17, 2022
22ef141
Começo da construção da função EDITAR
GustHenrique May 17, 2022
da81101
Atualizando README.md, script e comandos BD
GustHenrique May 17, 2022
c891f8a
Card component pronto
GustHenrique May 18, 2022
fcb5883
Adicionando mask nos inputs
GustHenrique May 18, 2022
2fe01a2
Ajustes no card e dando continuidade na criação da funcionalidade EDIT
GustHenrique May 18, 2022
c7cacd8
Novas alterações na função de EDITAR curso
GustHenrique May 18, 2022
4d146a7
Continuação do método EDITAR
GustHenrique May 18, 2022
b8cf463
Aplicação de responsividade nas telas
GustHenrique May 18, 2022
de57c5e
Ajuste botão retornar
GustHenrique May 18, 2022
9dab766
Removendo arquivos inuteis
GustHenrique May 18, 2022
f059815
excluindo component inutil
GustHenrique May 18, 2022
1cadc5d
Removendo interfaces inuteis
GustHenrique May 18, 2022
556e047
Atualizações na interface e remoção de códigos inuteis
GustHenrique May 19, 2022
e1e0e6a
Ajuste no DER, scriptDLL e README.md
GustHenrique May 19, 2022
e785793
Remoção do DER errado
GustHenrique May 19, 2022
7f6fdf9
Ajuste final scriptDLL
GustHenrique May 19, 2022
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
Binary file added DER e scriptDLL/DER.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
111 changes: 111 additions & 0 deletions DER e scriptDLL/scriptDDL.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
CREATE DATABASE IF NOT EXISTS "Database" WITH OWNER = postgres ENCODING = 'UTF8' CONNECTION
LIMIT
= -1;

CREATE TABLE IF NOT EXISTS Usuario (
id_Usuario BIGINT NOT NULL PRIMARY KEY,
email VARCHAR(45),
senha VARCHAR(45)
);

CREATE TABLE IF NOT EXISTS Curso (
id_Curso BIGINT NOT NULL PRIMARY KEY,
nome VARCHAR(45),
inicio TIME WITHOUT TIME ZONE,
fim TIME WITHOUT TIME ZONE
);

CREATE TABLE IF NOT EXISTS public.novo_curso
(
id_novo_curso bigint NOT NULL DEFAULT nextval('novo_curso_id_novo_curso_seq'::regclass),
sala integer,
inicio time without time zone,
fim time without time zone,
professor character varying(45) COLLATE pg_catalog."default",
nome character varying(45) COLLATE pg_catalog."default",
CONSTRAINT novo_curso_pkey PRIMARY KEY (id_novo_curso)
)

CREATE TABLE IF NOT EXISTS Professor (
id_Professor BIGINT NOT NULL PRIMARY KEY,
nome VARCHAR(45)
);

CREATE TABLE Professor_Curso (
profcurso_id BIGINT NOT NULL PRIMARY KEY,
professor_id INT NOT NULL,
Curso_id INT NOT NULL,
usuario_id INT NOT NULL,
FOREIGN KEY (professor_id) REFERENCES Professor (id_Professor),
FOREIGN KEY (Curso_id) REFERENCES Curso (id_Curso),
);

CREATE TABLE IF NOT EXISTS Sala_Curso (
Salacurso_id BIGINT NOT NULL PRIMARY KEY,
Sala_id INT NOT NULL,
Curso_id INT NOT NULL,
usuario_id INT NOT NULL,
FOREIGN KEY (Sala_id) REFERENCES Sala (id_Sala),
FOREIGN KEY (Curso_id) REFERENCES Curso (id_Curso),
);

INSERT INTO
Usuario (id_usuario, email, senha)
VALUES
(1, 'gusthenrique273@gmail.com', '123456');

INSERT INTO
Usuario (email, senha)
VALUES
(2, 'gust.leles2@gmail.com', '33566296');

INSERT INTO
Usuario (email, senha)
VALUES
(3, 'guseles2@gmail.com', 'aiuhnfy3');

INSERT INTO
Professor (id_professor, nome)
VALUES
(1, 'Paulo Cesar');

INSERT INTO
Professor (id_professor, nome)
VALUES
(2, 'Gustavo Henrique');

INSERT INTO
Professor (id_professor, nome)
VALUES
(3, 'Lecy da Silva');

INSERT INTO
Sala (id_sala, numero)
VALUES
(1, 1001);

INSERT INTO
Sala (id_sala, numero)
VALUES
(2, 1002);

INSERT INTO
Sala (id_sala, numero)
VALUES
(3, 1003);

INSERT INTO
novo_curso(nome, inicio, fim, professor, sala)
VALUES
('Curso de NodeJS', '12:00', '15:00', 'Gustavo Henrique', 1001);

INSERT INTO
novo_curso(nome, inicio, fim, professor, sala)
VALUES
('Curso de Angular', '16:00', '20:00', 'Paulo Cesar', 1002);

INSERT INTO
novo_curso(nome, inicio, fim, professor, sala)
VALUES
('Curso de PostgreSQL', '20:00', '23:59', 'Lecy da Silva', 1002);

43 changes: 22 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,25 @@
**Eu preciso** realizar a gestão dos cursos oferecidos pela Instituição, com seus respectivos professores, salas e horários
**Para** que o setor de Marketing possa vender os cursos online.

### Segue instruções para realizar o desafio

1. Faça um fork deste repositório.
2. Baseado no cenário acima, modele e crie o esquema do banco de dados para armazenar as informações normalizadas.
* Comite a imagem em jpg ou png do DER e o script do DDL.
3. Desenvolva uma API REST para realizar as operações necessárias com o banco de dados criado.
4. Baseado nas imagens `wireframe/1-login-mobile.png` e `wireframe/2-login-desktop.png`, crie a tela de login da aplicação.
* Considere apenas uma validação simples por e-mail e senha.
* Não existe a necessidade de CRUD de usuário, recuperação de senha ou outra operação mais complexa.
5. Baseado nas imagens `wireframe/3-cursos-mobile.png` e `wireframe/4-cursos-desktop.png`, crie a tela de visualização e deleção de cursos.
* Deve conter as informações de horário, professor e sala.
6. Baseado nas imagens `wireframe/5-detalhe-mobile.png` e `wireframe/6-detalhe-desktop.png`, crie a tela de criação e alteração de cursos.
* Os campos de professor e sala deverão ser um multi-select.
* Não existe a necessidade de CRUD de professor e sala.
7. Realizar um Pull Request para este repositório, com instruções necessárias para instalação e instânciação dos sistemas.

### O que será avaliado

1. Fidelidade às instruções e ao cenário.
2. Clean Code e boas práticas.
3. Boas práticas de versionamento.
### Segue instruções iniciar o sistema

1. Instalar as dependências com: **npm install --save** na pasta REST_api , é necessário ter
o Node na versão: 16.15.0 e o NPM na versão: 8.5.5 instalado na maquina.

2. Instalar as dependências com: **npm install --save** na pasta angular-front-end, é necessário ter
o CLI na versão: 13.5.5 e o NPM na versão: 8.5.5 instalado na maquina.

3. Rodar o scriptDLL.sql ou por meio do comando "node + nome do arquivo" rodar os arquivos 2_create.js, 3_insert.js para gerar o banco de dados em PostgreSQL.

4. As credenciais do PostgreSQL devem ser user: **postgres** , senha: **admin** , porta: **5432** e o nome do banco de dados: **Database**.

5. Na pasta REST_api iniciar com **npm run dev** ou **node index.js**, o servidor irá rodar na porta **8080**, certifique-se de não estar sendo utilizada.

6. Na pasta angular-front-end iniciar com **ng serve**, o servidor irá rodar na porta **4200**, certifique-se de não estar sendo utilizada.

7. A aplicação estará rodando em **http://localhost:4200/**.

8. As credenciais corretas para o login: **Email: gusthenrique273@gmail.com, senha:123456**
**Email: gust.leles2@gmail.com, senha: 33566296**
**Email: guseles2@gmail.com, senha: aiuhnfy3**

173 changes: 173 additions & 0 deletions REST_api/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const client = require("./js/_database");
const cors = require('cors');
const { response } = require('express');

app.use(cors())

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

client.connect();

app.listen(8080, ()=> {
console.log("api rodando na porta 8080")
});

// INICIO ROTAS GET
app.get('/curso', (req, res)=>{
client.query(`Select * from novo_curso`, (err, result)=>{
if(!err){
res.send({
message: 'Todos os cursos',
data:result.rows
});
}
});
client.end;
})

app.get('/curso/:id', (req, res)=>{
var id = req.params.id
var logQuery = `Select * from novo_curso
where id_novo_curso = ${id};`
client.query(logQuery, (err, result)=>{
if(!err){
res.send({
message: 'Todos os cursos',
data: result.rows
});
}
});
client.end;
})

app.get('/sala/:id', (req, res)=>{
var id = req.params.id
var logQuery = `Select * from sala
where id_sala = ${id};`
client.query(logQuery, (err, result)=>{
if(!err){
res.send(result.rows);
}
});
client.end;
})

app.get('/professor', (req, res)=>{
client.query(`Select * from professor`, (err, result)=>{
if(!err){
res.send({
message: 'Todos os professores',
data:result.rows
});
}
});
client.end;
})

app.get('/sala', (req, res)=>{
client.query(`Select * from sala`, (err, result)=>{
if(!err){
res.send({
message: 'Todas as salas',
data:result.rows
});
}
});
client.end;
})
// FIM ROTAS GET

// INICIO ROTAS POST
app.post('/curso/novo-curso', (req, res)=>{
const name = req.body.nome;
const inicio = req.body.inicio;
const fim = req.body.fim;
const professor = req.body.professor;
const sala = req.body.sala;
let insertQuery = ` insert into novo_curso(nome, inicio, fim, professor, sala)
values('${name}' , '${inicio}' , '${fim}', '${professor}', '${sala}' )`

client.query(insertQuery, (err, result) => {
if ( ! err){
res.send({
message: 'Curso cadastrado com sucesso!',
})
}
else { console.log(err.message) }
})
client.end;
})

app.post('/login', async (req, res, result)=> {

const email = req.body.email;
const senha = req.body.senha;


const data = await client.query(`SELECT email, senha
FROM public.usuario
WHERE email='${email}' and senha='${senha}'`)
if(data.rows == ''){
return res.status(401).send('Email ou senha inválidos')
} else {
return res.status(200).send(response)
}

});

// FIM ROTAS POST

//INICIO ROTAS PUT
app.put('/curso/:id', (req, res)=> {
var data = '';
const gId = req.params
console.log(req.body)
data = req.body.nome
const body = req.body.nome
console.log(data)
client.query(`UPDATE novo_curso SET nome = '${body.nome}',
sala = '${body.sala}',
inicio = '${body.inicio}',
fim = '${body.fim}',
professor = '${body.professor}'
where id_novo_curso = ${gId}`, (err, result)=>{
if(!err){
res.send({
message: 'Curso atualizado com sucesso!',
data: result.rows
})
}
else{ console.log(err.message) }
})
});

//FIM ROTAS PUT

// INICIO ROTAS DELETE
app.delete('/curso/:id', (req, res)=> {
var id = req.params.id
let insertQuery = `delete from novo_curso where id_novo_curso=${id}`

client.query(insertQuery, (err, result)=>{
if(!err){
res.send({
message: 'Curso removido com sucesso!',
})
}
else{ console.log(err.message) }
})
client.end;
})
// FIM ROTAS DELETE








16 changes: 16 additions & 0 deletions REST_api/js/1_drop.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const db = require("./_database")

async function dropTables() {
await db.connect()
await db.query('DROP TABLE curso CASCADE')
await db.query('DROP TABLE professor CASCADE')
await db.query('DROP TABLE professor_curso CASCADE')
await db.query('DROP TABLE sala CASCADE')
await db.query('DROP TABLE sala_curso CASCADE')
await db.query('DROP TABLE usuario CASCADE')
await db.end()

console.log("Tabelas removidas");
}

dropTables();
Loading