Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules/
157 changes: 157 additions & 0 deletions Controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
const express = require('express');
const cors = require('cors');

const {Sequelize} = require('./models');

const models = require('./models');

const app = express();
app.use(cors());
app.use(express.json());

let achado=models.Achado;
let perdido=models.Perdido;

app.get('/achado', function(req, res){
res.send('Hello World');
});

let port = process.env.PORT || 3001;

app.listen(port, (req,res)=> {
console.log('Servidor ativo: http://localhost:3001');
});


// INCLUSAO
//Incluir cadastro de ACHADOS no banco de dados
app.post('/incluir-achado', async(req,res) =>{
await achado.create(
req.body
).then(function(){
return res.json({
error: false,
message: 'Objeto achado cadastrado com sucesso'
})
}).catch(function(erro){
return res.status(400).json({
error: true,
message: 'Foi impossível se conectar'
})
});
});


//Incluir cadastro de PERDIDOS no banco de dados
app.post('/incluir-perdido', async(req,res) =>{
await perdido.create(
req.body
).then(function(){
return res.json({
error: false,
message: 'Objeto perdido notificado com sucesso'
})
}).catch(function(erro){
return res.status(400).json({
error: true,
message: 'Foi impossível se conectar'
})
});
});


//LISTAGEM
//Listar cadastro de ACHADOS do banco de dados
app.get('/listar-achados', async(req,res) => {
await achado.findAll({
//raw: true
order: [['descricao', 'ASC']]
}).then(function(achados){
res.json({achados})
});
});


//Listar cadastro de PERDIDOS do banco de dados
app.get('/listar-perdidos', async(req,res) => {
await perdido.findAll({
//raw: true
order: [['descricao', 'ASC']]
}).then(function(perdidos){
res.json({perdidos})
});
});



//EDITAR
//Editar cadastro de ACHADOS do banco de dados
app.put('/editar-achado/:id', async (req,res) => {
await achado.update (req.body,
{where: {id: req.params.id}})
.then(function(){
return res.json({
error: false,
message: "Cadastro foi alterado com sucesso"
})
}).catch(function(erro){
return res.status(400).json({
error: true,
message: "Houve erro na alteração do cadastro"
});
});
});


//Editar cadastro de PERDIDOS do banco de dados
app.put('/editar-perdido/:id', async (req,res) => {
await perdido.update (req.body,
{where: {id: req.params.id}})
.then(function(){
return res.json({
error: false,
message: "Cadastro foi alterado com sucesso"
})
}).catch(function(erro){
return res.status(400).json({
error: true,
message: "Houve erro na alteração do cadastro"
});
});
});



//EXCLUSAO
//Excluir cadastro de ACHADOS do banco de dados
app.get('/excluir-achado/:id', async (req,res) => {
await achado.destroy ({where: {id: req.params.id}})
.then(function(){
return res.json({
error: false,
message: "Cadastro foi excluído com sucesso"
})
}).catch(function(erro){
return res.status(400).json({
error: true,
message: "Houve erro na exclusão do cadastro"
});
});
});


//Excluir cadastro de PERDIDOS do banco de dados
app.get('/excluir-perdido/:id', async (req,res) => {
await perdido.destroy ({where: {id: req.params.id}})
.then(function(){
return res.json({
error: false,
message: "Cadastro foi excluído com sucesso"
})
}).catch(function(erro){
return res.status(400).json({
error: true,
message: "Houve erro na exclusão do cadastro"
});
});
});
82 changes: 34 additions & 48 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,34 @@
## Accurate Software

<img src="https://accurate.com.br/wp-content/uploads/2020/06/logo-accurate-300.svg" alt="drawing" width="200"/>

Seja bem-vindo a [Accurate Software](https://accurate.com.br).

Temos diversas vagas para desenvolvedores: Frontend, Backend e Fullstack!

> Para conhecer melhor os candidatos, preparamos um desafio técnico. Não se preocupe em cumprir todos os requisitos propostos no desafio, este teste visa avaliar a sua capacidade de resolução de problemas. Abaixo serão apresentados dois desafios direcionados aos perfis frontend e backend, caso o seu perfil for voltado para fullstack fique a vontade em nos enviar uma solução completa abordando tanto frontend quanto backend!

## Instruções

1. Para começar o desafio, realize um fork no repositório: https://github.com/accurate-software/accurate-software.github.io

2. O desafio deverá set commitado no fork.

3. Após a finalização do desafio, solicite um pull request do fork no nosso repositório ;)

### Desafio Frontend

O seu desafio é realizar um desenvolvimento de uma aplicação frontend que compra os requisitos:

+ Consumo de API REST
+ CRUD ou listagem de algum recurso da API
+ Utilizar alguma API pública, podendo ser alguma do site: https://public-apis.xyz/

Vamos avaliar a sua capacidade como desenvolvedor frontend, observando os critérios:

+ Uso semântico do HTML
+ Estruturação do layout e tags CSS
+ Layout acessível e responsivo
+ Utilização de frameworks da atualizade, como: React, Vue, Angular ou algum outro de sua preferência.
+ Lembre-se de documentar a solução com um README.MD :)

### Desafio Backend

O seu desafio é realizar um desenvolvimento de uma API Rest para um site de achados e perfidos. Sua API deve conter as seguintes funcionalidades:

+ Cadastro de um "Achado"/"Perdido"
+ Atualização de histórico de um "Achado"/"Perdido"
+ Busca com opção de filtros, como por exemplo: Categoria
+ Relatório de cruzamento de informações "Achados"/"Perdidos", dado um categoria e um raio.

Fique a vontade para usar a linguagem e framework de sua preferência, como: Java, C# e Node! Porém se atente aos seguintes pontos:

+ Tratamento de erros e exceções
+ Clareza e clean code no desenvolvimento da solução
+ Documentação da solução - README.MD :)
# lostfound
projeto de achados e perdidos - backend


SISTEMA DE ACHADOS E PERDIDOS

PROJETO - INICIADO 09/01/2022

Cadastro de Objetos Achados (achado)
descricao: string
localEncontrado: string
data: date
devolvido: boolean
devolvidoPara: string


Cadastro de Objetos Perdidos (perdido)
descricao: string
localPerda: string
data: date
recuperado: boolean
nomeProprietario: string
enderecoProprietario: string
telefoneProprietario: string

LINKS:
localhost:3001/incluir-achado = inclui registro de objeto achado
localhost:3001/incluir-perdido = inclui registro de objeto perdido
localhost:3001/listar-achados = lista todos objetos achados
localhost:3001/listar-perdidos = lista todos objetos perdidos
localhost:3001/editar-achado/:id = edita registro de objeto achado
localhost:3001/editar-perdido/:id = edita registro de objeto perdido
localhost:3001/excluir-achado/:id = exclui registro de objeto achado
localhost:3001/excluir-perdido/:id = exclui registro de objeto achado
23 changes: 23 additions & 0 deletions config/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"development": {
"username": "root",
"password": null,
"database": "lostfound",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
39 changes: 39 additions & 0 deletions migrations/20220110001648-create-achado.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('Achados', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
descricao: {
type: Sequelize.STRING
},
localEncontrado: {
type: Sequelize.STRING
},
data: {
type: Sequelize.DATE
},
devolvido: {
type: Sequelize.BOOLEAN
},
devolvidoPara: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('Achados');
}
};
45 changes: 45 additions & 0 deletions migrations/20220110001835-create-perdido.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('Perdidos', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
descricao: {
type: Sequelize.STRING
},
localPerda: {
type: Sequelize.STRING
},
data: {
type: Sequelize.DATE
},
recuperado: {
type: Sequelize.BOOLEAN
},
nomeProprietario: {
type: Sequelize.STRING
},
enderecoProprietario: {
type: Sequelize.STRING
},
telefoneProprietario: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('Perdidos');
}
};
27 changes: 27 additions & 0 deletions models/achado.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class Achado extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
}
};
Achado.init({
descricao: DataTypes.STRING,
localEncontrado: DataTypes.STRING,
data: DataTypes.DATE,
devolvido: DataTypes.BOOLEAN,
devolvidoPara: DataTypes.STRING
}, {
sequelize,
modelName: 'Achado',
});
return Achado;
};
Loading