Skip to content

a file server, where you will receive uploads of files in various formats and create a storage

Notifications You must be signed in to change notification settings

gobelohorizonte/fileserver

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FileServer

FileServer, um protótipo que tem como objetivo apresentar como funciona um storage para uploads de arquivos. É um exemplo de como um server irá comportar para armazenar arquivos em seu storage ou em buckets. Este projeto é puramente didâtico, todo construído com stdlib nativa de Go, usamos alguns libs externas para tratarmos JWT e tollbooth/limiter.

Banco de Dados

Estamos usando Postgresql para simulções, uma tabela de login, pasta, file e ambiente de trabalho. A versão do postgresql é psql (PostgreSQL) 9.6.9.

Endpoints

login, / create / user, / ping, / hello, / upload, / download serão os principais endpoints que serão gerenciados.

O upload é feito sempre no servidor local, há uma tabela com as configurações para determinar como esse upload deve ocorrer.

Tudo está registrado no banco de dados Postgresql.

A autenticação para upload de upload só é feita com token de acesso, disponibilizada no login do aplicativo.

O download verifica se o arquivo é local ou se já foi enviado para a nuvem, se ainda estiver no servidor local, o sistema fará o download localmente, caso contrário, verificará qual servidor em nuvem deve ser baixado da nuvem.

Dependencies

go get -u github.com/didip/tollbooth

go get -u github.com/lib/pq

go get -u golang.org/x/crypto/bcrypt

go get -u github.com/dgrijalva/jwt-go

Estrutura do Programa

- fileserver
	- certs
	 	- certs.go

	- handler
		- hello.go
		- login.go
		- ping.go
		- upload.go
		- upload_form_unic.go

	- pkg
		- auth
		- authi
		- cors
		- cryptf
		- gcolor
		- logf
		- pg
			
	- models
		- claim.go
		- responsetoken.go
		- user.go

	- route
		- apiconf.go
		- apishow.go
		- route.go	

	- src
		- fileserver
			- main.go	
			- Dockerfile

		- storage

Create User e Update senha


$ createuser fileserver -U postgres -O fileserver -E UTF-8 -T template0

$ psql -d template1 -U postgres

template1=# alter user fileserver password '1234';
template1=# \q

Create User e Update senha


$ createdb fileserver -U postgres -O fileserver -E UTF-8 -T template0

$ psql -d fileserver -f sql/fileserver.sql

Install FileServer

$ cd src/fileserver
$ go install
$ fileserver

Docker FileServer


$ docker run -d -e PORT_SERVER=5009 -e DB_HOST_1=localhost -p 5009:5009 jeffotoni/fileserver

A API retorna o status das solicitações

200 - OK. Successful.

400 - Bad request.

401 - Authorization required.

403 - Not allowed.

404 - Not found

409 - Already exists

420 - Rate limited

Limites da API

Você pode usar a API como quiser. Criamos um limite de taxa de 20.000 solicitações por segundo. Você pode alterar este limite de taxa em api-route se a variável global é chamada de "NewLimiter", você também pode alterar o tamanho máximo de uploads que o servidor permitirá.

Para cada chamada de API, os cabeçalhos HTTP padrão são retornados em detalhes nas estatísticas de uso atuais, incluindo o limite por hora, o número restante de ações e a hora em que a contagem de tempo será reiniciada.

Ping

O método é público e aberto não precisa de autenticação, para saber se o serviço está online

curl -X POST localhost:5000/v1/test/ping

OR

curl localhost:5000/v1/test/ping
curl -X POST localhost:5000/v1/user \
-H "Content-Type: application/json" \
-H "X-Key: ZmlsZXNlcnZlcjIwMThnb2xhbmdiaA==" \
-d @example/createuser.json

Login Form

O login é o manipulador responsável por autenticar a plataforma e retorna um token para que possa acessar os manipuladores privados.

[POST] /v1/user/login
curl -X POST localhost:5000/v1/user/login \
-H "X-Key: ZmlsZXNlcnZlcjIwMThnb2xhbmdiaA==" \
-d "[email protected]&password=1234"

OR

curl -X POST localhost:5000/v1/user/login \
-H "X-Key: ZmlsZXNlcnZlcjIwMThnb2xhbmdiaA==" \
-d "[email protected]" \
-d "password=1234"

OR

curl -X POST localhost:5000/v1/user/login \
-H "X-Key: ZmlsZXNlcnZlcjIwMThnb2xhbmdiaA==" \
-d '{"user":"[email protected]","password":"1234"}'

Response

Após o login, você receberá um token para usar em todas as chamadas

msg
{	
	"status":"ok",
	
	"msg":"success",
	
	"token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiamVmZi5vdG9uaUBnbWFpbC5jb20iLCJ1aWQiOiI0ZjQ0NzgxMTAzODkwNjA5ZmY1MDdmNjIzMTdlOGExMGFiMDc4ZjFmIiwidWlkd2tzIjoiMDE2NTcxNmNiNzBmMWM1N2ZhMzhhZGY5MGI1Y2QyMTdmNDE1NTJhNyIsImV4cCI6MTUzNzg0MzU5NCwiaXNzIjoiand0IEZpbGVTZXJ2ZXIifQ.XD6eCPDklwWw1WR7fViCSksRsMjsERZuHKRMIhQvgn63pwXTLBR6NvRAmc2JUyDmovEyDzo05LGDg3DadI-b5J3Su29OcZpKMF-aSqSBLzmuQ7Grl1z7EO-IircrkVkZ-Xuk8Ur3VBRhQt0Z_b7MwMgbClS2-SJGX5pPUi0SrZk",
	
	"expires":"2018-09-25"
}

Hello

O método Hello é um manipulador para testar seu token, ele receberá o token como um parâmetro, se o token estiver correto ele retornará um hello, caso contrário ele retornará um erro.

[POST] /v1/test/hello
curl -X POST localhost:5000/v1/test/hello \
-H "Authorization: Bearer {token}" \
curl -X PUT localhost:5000/v1/user/enable \
-H "Authorization: Bearer {tokem}" \
-d "[email protected]"

Upload to a File

O nome do campo do formulário é "file", para uploads. Este manipulador permitirá que você faça upload usando o formulário para isso.

[POST] /v1/file/upload
curl -X POST localhost:5000/v1/file/upload \
-H "Authorization: Bearer {token}" \
--form "[email protected]"

Upload to Multiple Files

O nome do campo do formulário é "file", para uploads. Esse manipulador permitirá que você faça vários envios ao mesmo tempo usando o formulário para isso.

[POST] /v1/file/upload
curl -X POST localhost:5000/v1/file/upload \
-H "Authorization: Bearer {token}" \
--form "file[][email protected]" \
--form "file[][email protected]" \
--form "file[][email protected]"

Upload Binary

Este manipulador permitirá que você faça o upload do arquivo como um binário, para que isso funcione corretamente, você terá que passar pelo cabeçalho o nome do arquivo.

[POST] /v1/file/upload
curl -X POST localhost:5000/v1/file/upload \
-H "Authorization: Bearer {token}" \
-H "Accept: binary/octet-stream" \
-H "Content-Type: binary/octet-stream" \
-H "Name-File: namefile.ext" \
--data-binary "@filetoupload"

Download

Esse manipulador é responsável pelo download do arquivo que está no servidor.

[GET] /v1/file/download
curl -X GET -o namefile.ext localhost:5000/v1/file/download \
-H "Content-Type: application/json" \ 
-H "Authorization: Bearer {token}" \ 
-d '{"id":"uuidfile"}'

OR

curl -X GET localhost:5000/v1/file/download \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \ 
-d '{"id":"uuidfile"}' \ > namefile.ext

About

a file server, where you will receive uploads of files in various formats and create a storage

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published