Skip to content
Guilherme Gregio edited this page Jul 14, 2016 · 4 revisions

Prova de Java

  1. Introdução
  2. Requisitos para o desenvolvimento
  3. Validação
  4. Utilize um banco de dados noSQL
  5. API REST (RESOURCES)
  6. Compilar o client para consumir sua aplicação
  7. Contato
### Desenvolva uma aplicação REST (json) Desenvolva uma API REST de geração de formulários e respostas.

Os formulários(templates) são ferramentas úteis que ajudam a planejar eventos, enviar pesquisas, aplicar testes em alunos ou colher informações de modo direto e fácil.

Este Formulário deve conter um título e os seus campos(perguntas) para simplificar utilizaremos somente os input's.

Os campos podem ser validados com os seguintes atributos: requerido, somente leitura, quantidade de caracteres máxima, valor default(caso a pergunta tenha uma resposta default) ou um placeholder.

Para consumir sua aplicação utilize o client que é fornecido neste repositório.

### Requisitos para o desenvolvimento
  • Utilize um banco de dados noSQL baseado em documentos
  • Desenvolva com tdd
  • Utilize um gerenciador de dependência
  • Automatize o build
  • Coloque o código no GitHub
  • Não fazer um fork deste repositório
### Validações

Formulários

  • Um formulário deve conter título e ao menos um campo
  • Um campo deve ter, obrigatoriamente, label e tipo
  • Quando o tipo do campo for radio, obrigatoriamente deve ser preenchido o atributo radio

Cadastros

  • O cadastro gerado por um formulário deve ser validado de acordo com suas configurações.

    Um campo pode ter as seguintes configurações: requerido, tamanho máximo, date, datetime, email, number, etc...

Caso não passe na validação

  • O server deve retornar com status 400, com o json seguindo o seguinte padrão
{
    "errors": [
        {
            "message": "O titulo não pode ser nulo",
            "category": "<nodeDoCampo>"
        },
        {
            "message": "O telefone deve conter no maximo x caracteres",
            "category": "<nomeDoCampo>"
        }
    ]
}
### Utilize um banco de dados noSQL Utilize um banco de dados noSQL baseado em documentos e grave tudo num único documento

Exemplo de documento:

{
	"_id": "51b8ac65e4b0b81dc2e743eb",
	"title": "Título do formulário",
	"fields": [{
		"label": "Nome",
		"type": "text",
		"required": true,
		"placeholder": "Nome:"
	},{
		"label": "Sexo",
		"type": "radio",
		"required": true,
		"radios": [{
			"label": "M",
			"value": "masculino"
		},{
			"label": "F",
			"value": "feminino"
		}],
		"value": 1
	},{
		"label": "E-mail",
		"type": "email",
		"required": false,
		"placeholder": "Digite um e-mail"
	},{
		"label": "idade",
		"type": "number",
		"required": false
	}],
	"data": [
		{
			"nome": "Guilherme",
			"sexo": "masculino",
			"email": "guilherme@email.com",
			"idade": 27
		},
		{
			"nome": "Rafael",
			"sexo": "masculino"
		}
	]
}
### API REST (RESOURCES)

Recursos para Template de Formulários

	<tr>
		<td><a href="#get-templates-id">GET /templates/:id</a></td>
		<td><i>Devolve um formulário com todos os campos</i></td>
	</tr>

	<tr>
		<td><a href="#post-templates">POST /templates</a></td>
		<td><i>Adiciona um formulário</i></td>
	</tr>

	<tr>
		<td><a href="#put-templates-id">PUT /templates/:id</a></td>
		<td><i>Atualiza um template</i></td>
	</tr>

	<tr>
		<td><a href="#delete-templates-id">DELETE /templates/:id</a></td>
		<td><i>Remove um template</i></td>
	</tr>
</tbody>
Recurso Descrição
GET /templates Devolve uma lista de formulários

Recursos para Dados do Formulário

	<tr>
		<td><a href="#post-templates-id-data">POST /templates/:id/data/</a></td>
		<td><i>Adiciona um dado num formulário</i></td>
	</tr>
</tbody>
Recursos Descrição
GET /templates/:id/data/ Devolve uma lista dos dados preenchidos em um formulário template
#### GET /templates

Devolve uma lista de formulários.

Url do recurso

http://<SEU-DOMINIO>:8080/coletor/templates

Exemplo de requisição

GET http://<SEU-DOMINIO>:8080/coletor/templates
	[
		{
			"_id": "519a7d41c38f6b4eb02df70c",
			"title": "Título do form",
			"fields": [
				{
					"label": "nome"
				},
				{
					"label": "email"
				},
				{
					"label": "telefone"
				}
			],
			"dataCount": "1000"
		},
		{
			"_id": "995a7d41c38f6b4eb02df90a",
			"title": "Título do form",
			"fields": [
				{
					"label": "nome"
				},
				{
					"label": "email"
				},
				{
					"label": "telefone"
				}
			],
			"dataCount": "1000"
		}
	]
#### GET /templates/:id

Devolve um formulário com todos os campos

Url do recurso

http://<SEU-DOMINIO>:8080/coletor/templates/:id

Exemplo de requisição

GET http://<SEU-DOMINIO>:8080/coletor/templates/519a7d41c38f6b4eb02df70c
	{
		"_id": "519a7d41c38f6b4eb02df70c",
		"title": "Formulário",
		"fields": [{
			"label": "nome",
			"type": "text",
			"required": true
		}]
	}
#### POST /templates

Adiciona um formulário

Parâmetros:
	<tr>
		<td>
			fields<br/>
			<i>requerido deve conter ao menos um field</i>
		</td>
		<td>
			<i>Array</i><br/>
		</td>
	</tr>

	<tr>
		<td>
			field.label<br/>
			<i>requerido</i>
		</td>
		<td>
			<i>String</i><br/>
			<b>Ex value:</b> Nome
		</td>
	</tr>

	<tr>
		<td>
			field.type<br/>
			<i>requerido</i>
		</td>
		<td>
			<i>String</i><br/>
			valores: color, date, datetime, datetime-local, email, month, number, tel, time, url, week, checkbox, radio
			<b>Ex value:</b> text
		</td>
	</tr>

	<tr>
		<td>
			field.required<br/>
			<i>opicional</i>
		</td>
		<td>
			<i>booleano</i><br/>
			se omitido por padrão é false.<br/>
			<b>Ex value:</b> true
		</td>
	</tr>

	<tr>
		<td>
			field.readOnly<br/>
			<i>opicional</i>
		</td>
		<td>
			<i>booleano</i><br/>
			se omitido por padrão é false, caso seja true anula o required.<br/>
			<b>Ex value:</b> true
		</td>
	</tr>

	<tr>
		<td>
			field.value<br/>
			<i>opicional</i>
		</td>
		<td>
			<i>string</i><br/>
			<b>Ex value:</b> Caio rolando da rocha
		</td>
	</tr>

	<tr>
		<td>
			field.maxLength<br/>
			<i>opicional</i>
		</td>
		<td>
			<i>number</i><br/>
			<b>Ex value:</b> 200
		</td>
	</tr>

	<tr>
		<td>
			field.placeholder<br/>
			<i>opicional</i>
		</td>
		<td>
			<i>string</i><br/>
			<b>Ex value:</b> Digite o nome:
		</td>
	</tr>

	<tr>
		<td>
			field.radio<br/>
			<i>opicional</i>
		</td>
		<td>
			<i>array</i><br/>
			requerido somente se o type for radio<br/>
			<b>Ex value:</b> <pre>[
{
    "label": "M",
    "value": "masculino"
},
{
    "label": "F",
    "value": "feminino"
}

]

Atributos Descrição
title
requerido
String
Ex value: Formulário teste
Url do recurso

http://<SEU-DOMINIO>:8080/coletor/templates

Exemplo de requisição

POST http://<SEU-DOMINIO>:8080/coletor/templates

Post Data
	{
		"title": "Nome do formulário",
		"fields": [{
			"label": "Sexo",
			"type": "radio",
			"required": true,
			"readOnly": false,
			"value": "masculino",
			"radios": [
				{
					"label": "M", 
					"value": "masculino"
				}, {
					"label": "F", 
					"value": "feminino"
				}
			]
		}]
	}	
	{
		"_id": "519a7d41c38f6b4eb02df70c",
		"title": "Nome do formulário",
		"fields": [{
			"label": "Sexo",
			"type": "radio",
			"required": true,
			"readOnly": false,
			"value": "masculino",
			"radios": [
				{
					"label": "M", 
					"value": "masculino"
				}, {
					"label": "F", 
					"value": "feminino"
				}
			]
		}]
	}
#### PUT /templates/:id
Url do recurso

http://<SEU-DOMINIO>:8080/coletor/templates/:id

Atualizar um template de formulário

Exemplo de requisição

PUT http://<SEU-DOMINIO>:8080/coletor/templates/519a7d41c38f6b4eb02df70c

Put Data
	{
		"title": "Alterando o titulo.",
		"fields": [{
			"label": "Sexo",
			"type": "radio",
			"required": true,
			"readOnly": false,
			"value": "masculino",
			"radios": [
				{
					"label": "M", 
					"value": "masculino"
				}, {
					"label": "F", 
					"value": "feminino"
				}
			]
		},{
			"label": "Nome",
			"type": "text",
			"required": true
		}]
	}
	{
		"_id": "519a7d41c38f6b4eb02df70c",
		"title": "Alterando o titulo.",
		"fields": [{
			"label": "Sexo",
			"type": "radio",
			"required": true,
			"readOnly": false,
			"value": "masculino",
			"radios": [
				{
					"label": "M", 
					"value": "masculino"
				}, {
					"label": "F", 
					"value": "feminino"
				}
			]
		},{
			"label": "Nome",
			"type": "text",
			"required": true
		}]
	}
#### DELETE /templates/:id
Url do recurso

http://<SEU-DOMINIO>:8080/coletor/templates/:id

Remove um template de formulário

Exemplo de requisição

DELETE http://<SEU-DOMINIO>:8080/coletor/templates/519a7d41c38f6b4eb02df70c
#### GET /templates/:id/data
Url do recurso

http://<SEU-DOMINIO>:8080/coletor/templates/:id/data

Exemplo de requisição

GET http://<SEU-DOMINIO>:8080/coletor/templates/519a7d41c38f6b4eb02df70c/data
	{
		"fields": [
			{"label": "id"}, 
			{"label": "nome"}, 
			{"label": "telefone"}, 
			{"label": "email"}, 
			{"label": "apelido"}
		],
		"data": [{
			"nome": "nome1",
			"telefone": "99999-999",
			"email": "gfg@gmail.com",
			"apelido": "apelido1"
		},
		{
			"nome": "nome2",
			"apelido": "apelido2",
			"idade": 23
		}]
	}
#### POST /templates/:id/data
Url do recurso

http://<SEU-DOMINIO>:8080/coletor/templates/:id/data

Exemplo de requisição

POST http://<SEU-DOMINIO>:8080/coletor/templates/519a7d41c38f6b4eb02df70c/data

Post Data
	{
		"nome": "Guilherme",
		"telefone": "99999-9999",
		"email": "email@gfg.com.br",
		"apelido": "GFG"
	}
### Compilar o client para utilizar em sua aplicação
  • Código do client

    https://github.com/guilhermegregio/gfg-prova

  • Pré-requisitos

    Nodejs

      npm install -g grunt-cli bower
    

    Compass

      gem install compass
    
  • Build

    Execute os seguintes comandos:

      npm install && bower install
    
      grunt
    

    Para testar copie a pasta "dist" gerada pelo grunt, para dentro da sua aplicação.

### Contato
Envie o projeto ou tire qualquer dúvidas no email: 

guilherme.gregio@dafiti.com.br