Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
8dadfc8
(feat) Estrutura básica do projeto
Dec 7, 2020
8c9ba63
(fix) Deleted repository reference
Dec 7, 2020
f2eccd8
(fix) Add repository reference
Dec 7, 2020
35234ea
(fix) Update on README.md file
Dec 7, 2020
f8bfc4e
Update README.md
gustavomolina Dec 7, 2020
9b524bb
Update README.md
gustavomolina Dec 7, 2020
da0878b
Update README.md
gustavomolina Dec 7, 2020
440219a
Update README.md
gustavomolina Dec 7, 2020
fa084f9
Update README.md
gustavomolina Dec 7, 2020
43debb3
Update README.md
gustavomolina Dec 7, 2020
074a00c
Update README.md
gustavomolina Dec 7, 2020
3e85f73
Update README.md
gustavomolina Dec 7, 2020
b35f88f
Update README.md
gustavomolina Dec 7, 2020
e6be8e7
Update README.md
gustavomolina Dec 8, 2020
303f479
Update README.md
gustavomolina Dec 8, 2020
4bf06e0
Update README.md
gustavomolina Dec 8, 2020
644e6a8
Update README.md
gustavomolina Dec 8, 2020
f118bd1
Update README.md
gustavomolina Dec 8, 2020
3606d32
Update README.md
gustavomolina Dec 8, 2020
fd40f61
Update README.md
gustavomolina Dec 8, 2020
026df85
Update README.md
gustavomolina Dec 8, 2020
73e301e
Update README.md
gustavomolina Dec 8, 2020
8738c19
(feat) Unit Tests with XUnit:
Dec 8, 2020
058df87
Merge branch 'main' of github.com:gustavomolina/accurate-software.git…
Dec 8, 2020
e5e0f84
Update _config.yml
gustavomolina Dec 8, 2020
942ba70
Update README.md
gustavomolina Dec 8, 2020
091abd5
Update README.md
gustavomolina Dec 9, 2020
9e6c458
(feat) Front End in Angular
Dec 9, 2020
33bb674
Merge branch 'main' of github.com:gustavomolina/accurate-software.git…
Dec 9, 2020
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
123 changes: 93 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,111 @@
## Accurate Software
<h1 align="center">IFound</h1>
<p align="center">🚀 API REST densenvolvida em .NET Core!</p>
<a href="https://accurate.com.br/">
<img src="https://img.shields.io/static/v1?label=API&message=Accurate&color=7159c1&style=for-the-badge&logo=ghost"/>
</a>

<img src="https://accurate.com.br/wp-content/uploads/2020/06/logo-accurate-300.svg" alt="drawing" width="200"/>
## Sobre
O projeto IFound trata-se de uma API REST para prover dados a um site de achados e perdidos

Seja bem-vindo a [Accurate Software](https://accurate.com.br).
## Tabela de conteúdos
<!--ts-->
* [Sobre](#sobre)
* [Tabela de Conteúdos](#tabela-de-conteúdos)
* [Features](#features)
* [Tecnologias](#-tecnologias)
* [Pré-requisitos](#pré-requisitos)
* [Rodando a aplicação](#rodando-a-aplicação)
* [Testes](#testes)
<!--te-->

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

> 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!
- [x] Cadastro de um “Achado”/”Perdido”
- [x] Atualização de histórico de um “Achado”/”Perdido”
- [x] Busca com opção de filtros
- [x] Relatório de cruzamento de informações “Achados”/”Perdidos”, dado um categoria e um raio

## Instruções
### 🛠 Tecnologias
Para a construção deste projeto, foram utilizadas as seguintes ferramentas:
#### No Back-End:
- [.NET Core](https://dotnet.microsoft.com/)
- [Entity Framework Core](https://docs.microsoft.com/pt-br/ef/core/)
- [SQL Server](https://www.microsoft.com/en-us/sql-server)
- [XUnit](https://xunit.net/)
- [OData](https://www.odata.org/)

1. Para começar o desafio, realize um fork no repositório: https://github.com/accurate-software/accurate-software.github.io
#### No Front-End
- [Angular](https://angular.io/)
- [Jasmine](https://jasmine.github.io/)

2. O desafio deverá set commitado no fork.
### Pré-requisitos
Antes de começar, você precisará ter instalado em sua máquina as seguintes ferramentas:
* Git (https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
* SDK Do ASP.NET Core Versão 3.1 (https://dotnet.microsoft.com/download/dotnet-core/3.1)
* SQL Server LocalDB (https://docs.microsoft.com/pt-br/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver15) ou seu banco de dados de preferência
* NPM (https://www.npmjs.com/get-npm)
* CLI do Angular (https://cli.angular.io/)

3. Após a finalização do desafio, solicite um pull request do fork no nosso repositório ;)
### Rodando a aplicação
#### API IFound
Para instalar e rodar o projeto em sua máquina, siga os seguintes passos;
* Rode o comando "git clone 'url-do-repositorio'" na sua máquina local
* Para facilitar a criação das estruturas no banco, criei um script para o SQL Server (SetUpDB.sql), basta executá-lo
* Mude a string de conexão com o banco no arquivo 'appsettings.json' com os seus dados de conexão
* Mudar a string de conexão em 'appsettings.json' com os dados do seu banco
* Dentro da pasta "ifound-api", rode o projeto via comando "dotnet run ifound-api.csproj"

### Desafio Frontend
#### Aplicação front-end
* Na pasta 'front-end-ifound' instale os pacotes via 'npm install'
* Execute a aplicação via comando 'ng serve'

O seu desafio é realizar um desenvolvimento de uma aplicação frontend que compra os requisitos:
### Testes
As demonstrações dos testes foram todas feitas via ferramenta Postman (https://www.postman.com/). Neste artigo, foi feita uma simples demonstração de funcionalidade para cada feature existente no backlog do projeto.

+ 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/
#### Feature: Cadastro de um “Achado”/”Perdido”
Para esta feature, foi feita uma demonstração com o cadastro de um produto por meio do endpoint "AddObject". A este endpoint foram passadas as informações do objeto, assim como sua categoria e dados das pessoas que perderam o objeto ou o encontraram. Desse modo, o objeto foi registrado com o id de categoria igual a 3 (por ser da categproa sapato) e foram assosiados a ele os ids 2 e 3 das pessoas que o perderam e o encontraram respectivamente.

Vamos avaliar a sua capacidade como desenvolvedor frontend, observando os critérios:
![GIF Adicionar](ifound-api/gifs/gif_add_test_ifound.gif)

+ 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 :)
#### Feature: Atualização de histórico de um “Achado”/”Perdido”
Pada demonstrar esta feature, foi utilizado o endpoint "UpdateObject". Neste sentido, foram passados os dados do objeto a que se tem a intenção de atualizar. Para isso, foi escolhido o objeto de id igual a 5 (Smartphone Xiaomi Note 8). Foram atualizados os campos de descrição do objeto e o local em que foi perdido. A seguir, pode-se ver que os dados foram persisitidos ao se fazer uma consulta de todos os objetos via endpoint "GelAllObjects".

### Desafio Backend
![GIF Atualizar](ifound-api/gifs/gif_update_test_ifound.gif)

#### Feature: Busca com opção de filtros
Na demonstração desta feature foi utilizado o endpoint "GetAllObjects" para se validar a funcionalidade dos filtros. Estes foram implementados via pacote OData da Microsoft, que permite consultas personalizadas aos endpoints da API. Para demonstrar a eficiência dos filtros, primeiro fez-e uma consulta de todos osobjetos do endpoint. Logo após isso, fez-se uma consulta de todos os objetos que possuiam a propriedade "ObjectId" da entidade "Object" com valor igual a 5. Para isso, foi incorpordado à URL da requisição os seguintes parâmetros:

* _"$Filter=Object/ObjectId eq 5"_

A seguir, fez-se uma consulta de todos os objetos que possuiam a propriedade "CategoryId" da entidade "ObjectCategory" com valor igual a 1 (categoria de roupas), mudando os parâmetros como o axemplo:

* _?$Filter=ObjectCategory/CategoryId eq 1_

![GIF Filtros](ifound-api/gifs/gif_filter_test_ifound.gif)

#### Feature: Relatório de cruzamento de informações “Achados”/”Perdidos”, dado uma categoria e um raio
Por fim, para se demonstrar a última feature do backlog, foi feita uma consulta com o seguinte filtro:

* _?$Filter=ObjectCategory/CategoryId eq 3 and Object/ObjectLostLocation eq 'São José do Rio Preto / SP'_

Com isso, temos um relatório dos objetos com base em sua categoria e localização. Na demonstração, pode-se observar que foram encontrados dois produtos (Tênis da Nike e Tênis da Adidas), ambos com id de categoria igual a 3 (sapatos) e tambeém ambos com localização de onde foram perdidos igual a 'São José do Rio Preto / SP'

![GIF Relatorio](ifound-api/gifs/gif_report_test_ifound.gif)

#### Demonstrações no Front-End
Para dar mais realismo ao projeto, foi desenvolvida uma aplicação front-end simples em Angular 10 que ilustra algumas de suas features.
Primeiramente, pode-se ver na demosntração a seguir, como é feita a listagem dos objetos pela aplicação. Ao clicar sobre determinado objeto, são exibidas as suas informações.

![GIF Listagem Front](ifound-api/gifs/gif_list_front_ifound.gif)

Em seguida, clicando no botão de editar, é possivel por meio da tela de detalhe do item, poder editar qualquer uma de suas informações. Na demonstração, assim que o item é editado e não ocorre nenhuma exceção é possível ver a modificação já na tela de listagem.

![GIF Update Front](ifound-api/gifs/gif_update_front_ifound.gif)

Por fim, para ilustrar a operação de cadastro de um achado ou perdido, na demonstração a seguir é cadastrado um objeto via tela tela de cadastro e em seguida, a nova inserção pode ser visualizada na tela de listagem de itens.

![GIF Update Front](ifound-api/gifs/gif_add_front_ifound.gif)

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 :)
212 changes: 212 additions & 0 deletions SetUpDB.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
/*********************************************************************
* *
* SQL Server script to create and populate a database for IFound API *
* *
*********************************************************************/

CREATE DATABASE IFound
GO

USE [IFound]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
--Person table
CREATE TABLE [dbo].[Person](
[PersonId] [int] NOT NULL,
[Name] [varchar](50) NULL,
[Age] [int] NULL,
[Nationality] [varchar](50) NULL,
[Telephone] [varchar](50) NULL,
[Email] [varchar](50) NULL,
PRIMARY KEY CLUSTERED
(
[PersonId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

--Insert some data
INSERT INTO [dbo].[Person]
([PersonId]
,[Name]
,[Age]
,[Nationality]
,[Telephone]
,[Email])
VALUES
(2
,'Ana Moreira'
,22
,'Brasileiro(a)'
,'(60) 63384-0485'
,'ana@email.com.br')

GO

--Category table
CREATE TABLE [dbo].[Category](
[CategoryId] [int] NOT NULL,
[CategoryDescription] [varchar](50) NULL,
PRIMARY KEY CLUSTERED
(
[CategoryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

--Insert Some DATABASE
INSERT INTO [dbo].[Category]
([CategoryId]
,[CategoryDescription])
VALUES
(3
,'Sapatos')

GO

--Object TABLE
CREATE TABLE [dbo].[Object](
[ObjectName] [varchar](50) NULL,
[ObjectDescription] [varchar](50) NULL,
[ObjectStatus] [varchar](50) NULL,
[ObjectPhoto] [varchar](50) NULL,
[ObjectFoundLocation] [varchar](50) NULL,
[ObjectLostLocation] [varchar](50) NULL,
[ObjectCreationDate] [varchar](50) NULL,
[ObjectLastUpdate] [varchar](50) NULL,
[Category_FK] [int] NULL,
[PersonWhoFound_FK] [int] NULL,
[PersonWhoLost_FK] [int] NULL,
[ObjectId] [int] IDENTITY(1,1) NOT NULL,
PRIMARY KEY CLUSTERED
(
[ObjectId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Object] WITH CHECK ADD FOREIGN KEY([Category_FK])
REFERENCES [dbo].[Category] ([CategoryId])
GO

ALTER TABLE [dbo].[Object] WITH CHECK ADD FOREIGN KEY([PersonWhoFound_FK])
REFERENCES [dbo].[Person] ([PersonId])
GO

ALTER TABLE [dbo].[Object] WITH CHECK ADD FOREIGN KEY([PersonWhoLost_FK])
REFERENCES [dbo].[Person] ([PersonId])
GO

GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

--Procedure to add object
CREATE PROCEDURE [dbo].[sp_AddFoundOrLost]
@ObjectName NVARCHAR(50) ,
@ObjectDescription NVARCHAR(50) ,
@ObjectStatus NVARCHAR(50) ,
@ObjectPhoto NVARCHAR(50) ,
@ObjectFoundLocation NVARCHAR(50) ,
@ObjectLostLocation NVARCHAR(50) ,
@ObjectCreationDate NVARCHAR(50) ,
@ObjectLastUpdate NVARCHAR(50),
@Category_FK integer,
@PersonWhoFound_FK integer,
@PersonWhoLost_FK integer,
@SuccessOnAdding int OUTPUT

AS
BEGIN

INSERT INTO [dbo].[Object]
(
ObjectName,
ObjectDescription,
ObjectStatus,
ObjectPhoto,
ObjectFoundLocation,
ObjectLostLocation,
ObjectCreationDate,
ObjectLastUpdate,
Category_FK,
PersonWhoFound_FK,
PersonWhoLost_FK
)
VALUES
(
@ObjectName,
@ObjectDescription,
@ObjectStatus,
@ObjectPhoto,
@ObjectFoundLocation,
@ObjectLostLocation,
@ObjectCreationDate,
@ObjectLastUpdate,
@Category_FK,
@PersonWhoFound_FK,
@PersonWhoLost_FK
)
IF(@@ROWCOUNT>0) SET @SuccessOnAdding=1
ELSE SET @SuccessOnAdding=0
END

GO

--Procedure to update object
CREATE PROCEDURE [dbo].[sp_UpdateFoundOrLost]
@ObjectId INTEGER,
@ObjectName NVARCHAR(50) ,
@ObjectDescription NVARCHAR(50) ,
@ObjectStatus NVARCHAR(50) ,
@ObjectPhoto NVARCHAR(50) ,
@ObjectFoundLocation NVARCHAR(50) ,
@ObjectLostLocation NVARCHAR(50) ,
@ObjectCreationDate NVARCHAR(50) ,
@ObjectLastUpdate NVARCHAR(50),
@Category_FK integer,
@PersonWhoFound_FK integer,
@PersonWhoLost_FK integer,
@SuccessOnUpdating int OUTPUT

AS
BEGIN
UPDATE [dbo].[Object]
SET
ObjectName = @ObjectName,
ObjectDescription = @ObjectDescription,
ObjectStatus = @ObjectStatus,
ObjectPhoto = @ObjectPhoto,
ObjectFoundLocation = @ObjectFoundLocation,
ObjectLostLocation = @ObjectLostLocation,
ObjectCreationDate = @ObjectCreationDate,
ObjectLastUpdate = @ObjectLastUpdate,
Category_FK = @Category_FK,
PersonWhoFound_FK = @PersonWhoFound_FK,
PersonWhoLost_FK = @PersonWhoLost_FK

WHERE
ObjectId = @ObjectId

IF(@@ROWCOUNT>0) SET @SuccessOnUpdating=1
ELSE SET @SuccessOnUpdating=0
END
GO







2 changes: 1 addition & 1 deletion _config.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
theme: jekyll-theme-architect

name: Accurate Software
title: null
title: ifound-api

#remote_theme: accurate-software/dactl
17 changes: 17 additions & 0 deletions front-end-ifound/.browserslistrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries

# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support

# You can see what browsers were selected by your queries by running:
# npx browserslist

last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major version
last 2 iOS major versions
Firefox ESR
not IE 9-11 # For IE 9-11 support, remove 'not'.
16 changes: 16 additions & 0 deletions front-end-ifound/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false
Loading