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.
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.
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.
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
- 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
$ createuser fileserver -U postgres -O fileserver -E UTF-8 -T template0
$ psql -d template1 -U postgres
template1=# alter user fileserver password '1234';
template1=# \q
$ createdb fileserver -U postgres -O fileserver -E UTF-8 -T template0
$ psql -d fileserver -f sql/fileserver.sql
$ cd src/fileserver
$ go install
$ fileserver
$ docker run -d -e PORT_SERVER=5009 -e DB_HOST_1=localhost -p 5009:5009 jeffotoni/fileserver
200 - OK. Successful.
400 - Bad request.
401 - Authorization required.
403 - Not allowed.
404 - Not found
409 - Already exists
420 - Rate limited
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.
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
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"}'
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"
}
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]"
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]"
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]"
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"
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