Skip to content
This repository has been archived by the owner on Nov 7, 2024. It is now read-only.

Desafio Lucas Chaves #115

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.idea
go.sum
postgres-data
node_modules
40 changes: 24 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
# Desafio técnico para desenvolvedores
# Desafio técnico

Construa uma nova aplicação, utilizando o framework de sua preferência (Ruby on Rails, Elixir Phoenix, Python Django ou Flask, NodeJS Sails, Java Spring, ASP.NET ou outro), a qual deverá conectar na API do GitHub e disponibilizar as seguintes funcionalidades:
O desafio foi desenvolvido com:

- Botão para buscar e armazenar os repositórios destaques de 5 linguagens à sua escolha;
- Listar os repositórios encontrados;
- Visualizar os detalhes de cada repositório.
- Front: React, React-Bootstrap
- Back: Gin/golang
- Test: React Testing e Assert
- Db: PostgreSQL

Alguns requisitos:
Para iniciar a aplicação, execute o seguinte comando na pasta raiz do projeto:

- Deve ser uma aplicação totalmente nova;
- A solução deve estar em um repositório público do GitHub;
- A aplicação deve armazenar as informações encontradas;
- Utilizar PostgreSQL, MySQL ou SQL Server;
- O deploy deve ser realizado, preferencialmente, no Heroku, AWS ou no Azure;
- A aplicação precisa ter testes automatizados;
- Preferenciamente dockerizar a aplicação;
- Por favor atualizar o readme da aplicação com passo a passo com instrução para subir o ambiente.
```
docker-compose up --build
```
Quando o processo de build terminar, acesse http://localhost e clique no botão "Carregar".

Quando terminar, faça um Pull Request neste repo e avise-nos por email.
Caso queira rodar os testes ou iniciar o container individualmente, basta entra na pasta "web" ou "apis" e então pode rodar esses comandos:

**IMPORTANTE:** se você não conseguir finalizar o teste, por favor nos diga o motivo e descreva quais foram as suas dificuldades. Você pode também sugerir uma outra abordagem para avaliarmos seus skills técnicos, vender seu peixe, mostrar-nos do que é capaz.
Container:
```
docker-compose up --build
```
Teste api:
```
go test
```
Teste web:
```
npm teste
```
2 changes: 2 additions & 0 deletions apis/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
postgres-data
.idea
3 changes: 3 additions & 0 deletions apis/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
go.sum
.idea
postgres-data
19 changes: 19 additions & 0 deletions apis/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
FROM golang:latest

WORKDIR /app

COPY go.mod .

COPY go.sum .

RUN go mod download

COPY . .

RUN go build

RUN find . -name "*.go" -type f -delete

EXPOSE 8080

CMD ["./apis"]
49 changes: 49 additions & 0 deletions apis/controllers/controller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package controllers

import (
"apis/database"
"apis/models"
"encoding/json"
"github.com/gin-gonic/gin"
"github.com/parnurzeal/gorequest"
"net/http"
)

func CreateRepositories(c *gin.Context) {
var languages = [5]string{"go", "python", "javascript", "csharp", "c++"}

for l := 0; l < len(languages); l++ {
_, body, errs := gorequest.New().Get("https://api.github.com/search/repositories?q=language:" + languages[l] + "&per_page=10").End()
if errs != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": "error when querying"})
}

var resp models.Resp
var repo models.Repository
err := json.Unmarshal([]byte(body), &resp)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": "error when querying"})
}

for i := 0; i < len(resp.Items); i++ {
data := resp.Items[i]
repo.ID = data.ID
repo.FullName = data.FullName
repo.Description = data.Description
repo.Name = data.Name
repo.OwnerLogin = data.Owner.Login
repo.OwnerUrl = data.Owner.URL
repo.HtmlUrl = data.HTMLURL
repo.Private = data.Private
repo.Language = data.Language
database.DB.Create(&repo)
}
}
c.JSON(http.StatusCreated, gin.H{"success": true, "message": "OK"})
}

func ListRepoLanguage(c *gin.Context) {
var repositories []models.Repository
database.DB.Find(&repositories)
c.JSON(http.StatusOK, gin.H{"success": true, "data": repositories})
}
22 changes: 22 additions & 0 deletions apis/database/database.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package database

import (
"apis/models"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)

var DB *gorm.DB
var err error

func Start() {
dns := "host=postgres user=root password=root dbname=root port=5432 sslmode=disable"
DB, err = gorm.Open(postgres.Open(dns))
if err != nil {
panic("Error connecting to database")
}
err := DB.AutoMigrate(&models.Repository{})
if err != nil {
panic("Error connecting to database ")
}
}
21 changes: 21 additions & 0 deletions apis/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
version: '3'
services:
postgres:
image: "postgres"
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=root
- POSTGRES_DB=root
ports:
- "5432:5432"
volumes:
- ./postgres-data:/var/lib/postgresql/data
app:
container_name: apis
build:
context: .
dockerfile: Dockerfile
depends_on:
- "postgres"
ports:
- '8080:8080'
48 changes: 48 additions & 0 deletions apis/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
module apis

go 1.17

require (
github.com/gin-contrib/cors v1.3.1
github.com/gin-gonic/gin v1.7.7
github.com/parnurzeal/gorequest v0.2.16
github.com/stretchr/testify v1.7.0
gorm.io/driver/postgres v1.3.1
gorm.io/gorm v1.23.1
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/elazarl/goproxy v0.0.0-20220328115640-894aeddb713e // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.13.0 // indirect
github.com/go-playground/universal-translator v0.17.0 // indirect
github.com/go-playground/validator/v10 v10.4.1 // indirect
github.com/golang/protobuf v1.3.3 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.10.1 // indirect
github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgproto3/v2 v2.2.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
github.com/jackc/pgtype v1.9.1 // indirect
github.com/jackc/pgx/v4 v4.14.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/json-iterator/go v1.1.9 // indirect
github.com/leodido/go-urn v1.2.0 // indirect
github.com/mattn/go-isatty v0.0.12 // indirect
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/smartystreets/goconvey v1.7.2 // indirect
github.com/ugorji/go/codec v1.1.7 // indirect
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect
golang.org/x/text v0.3.7 // indirect
gopkg.in/yaml.v2 v2.2.8 // indirect
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
moul.io/http2curl v1.0.0 // indirect
)
11 changes: 11 additions & 0 deletions apis/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package main

import (
"apis/database"
"apis/routes"
)

func main() {
database.Start()
routes.HandleRequests()
}
39 changes: 39 additions & 0 deletions apis/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package main

import (
"github.com/stretchr/testify/assert"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"

"apis/controllers"
"github.com/gin-gonic/gin"
)

func CreateTestsRouters() *gin.Engine {
gin.SetMode(gin.ReleaseMode)
rotas := gin.Default()
return rotas
}

func TestCreateRepositories(t *testing.T) {
r := CreateTestsRouters()
r.POST("/repositories", controllers.CreateRepositories)
req, _ := http.NewRequest("POST", "/repositories", nil)
response := httptest.NewRecorder()
r.ServeHTTP(response, req)
assert.Equal(t, http.StatusAccepted, response.Code)
mockResponse := `{"message": "OK","success": true}`
responseBody, _ := ioutil.ReadAll(response.Body)
assert.Equal(t, mockResponse, string(responseBody))
}

func TestGetRepositories(t *testing.T) {
r := CreateTestsRouters()
r.GET("/repositories", controllers.CreateRepositories)
req, _ := http.NewRequest("GET", "/repositories", nil)
response := httptest.NewRecorder()
r.ServeHTTP(response, req)
assert.Equal(t, http.StatusAccepted, response.Code)
}
Loading