Skip to content
Snippets Groups Projects
Commit a5c59d80 authored by David PETIT's avatar David PETIT
Browse files

Initial commit

parents
Branches
No related tags found
No related merge requests found
Showing
with 912 additions and 0 deletions
/vendor/
/mongodbdata/
\ No newline at end of file
# Version
FROM golang:latest
RUN mkdir /app
# Add fill and folder inside the docker
ADD . /app/
# CURRENT DIRECTORY (docker)
WORKDIR /app
# Library
RUN go mod download
RUN go build -o main .
# Launch the application builder
CMD ["/app/main"]
\ No newline at end of file
# REST-API-GO
The security of the api is based on Gin-JWT.
# Launch
## Start API in container :whale:
change url mongodb in main.go (mongodb://127.0.0.1:27017)
```
sudo chmod +x ./install.sh
sudo ./install.sh
```
## Start API without docker :space_invader:
change url mongodb in main.go (mongodb://mongo:27017/)
Prerequisite :
- mongo client/server
```sh
docker run -d -p 27017-27019:27017-27019 --name RESTmongo mongo
```
- go lastest version
```sh
go mod init github.com/Debzou/REST-API-GO
go mod vendor
go run main.go
```
or
```sh
sudo chmod +x ./packaged-api.sh
sudo ./packaged-api.sh
go run main.go
```
# The status
When a user creates an account on the api, the user is automatically in "mormal_user".
- normal_user : this status prevents middleware authorization.
- admin : this status allows to use the middlware.
To have the administrator status, you have to log in to mongodb and modify your profile.
# Routes
The token must be put in (auth / bearer token)
Data must be in json format
Static file : css / js
```sh
[GIN-debug] GET /static/*filepath --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
[GIN-debug] HEAD /static/*filepath --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
```
API visualisation (view)
```sh
[GIN-debug] GET /datavis/index --> github.com/Debzou/REST-API-GO/internal/controllers.Getindex (3 handlers)
[GIN-debug] GET /datavis/geovis --> github.com/Debzou/REST-API-GO/internal/controllers.GetGeoVis (3 handlers)
```
Routes Protected
```sh
[GIN-debug] GET /auth/refresh_token --> github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).RefreshHandler-fm (3 handlers)
[GIN-debug] GET /auth/hello --> github.com/Debzou/REST-API-GO/internal/controllers.HelloHandler (4 handlers)
```
Login / Signup
```sh
[GIN-debug] POST /signup --> github.com/Debzou/REST-API-GO/internal/controllers.CreateUser (3 handlers)
[GIN-debug] POST /login --> github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).LoginHandler-fm (3 handlers)
```
version: '3'
services:
api:
container_name: api1.0
restart: always
build: .
ports:
- '8080:8080'
depends_on:
- mongo
mongo:
container_name: mongo
image: mongo
ports:
- '27017:27017'
volumes:
- './mongodbdata:/data/db'
#sudo docker-compose up
\ No newline at end of file
go.mod 0 → 100644
module github.com/Debzou/REST-API-GO
go 1.14
require (
github.com/appleboy/gin-jwt/v2 v2.6.3
github.com/gin-gonic/gin v1.6.3
go.mongodb.org/mongo-driver v1.4.0
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
)
go.sum 0 → 100644
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/appleboy/gin-jwt v1.0.1 h1:cbLi6ol8KhWUoCBvLFCGpssiBB2iM9eXWwmI9SDG+W0=
github.com/appleboy/gin-jwt v2.5.0+incompatible h1:oLQTP1fiGDoDKoC2UDqXD9iqCP44ABIZMMenfH/xCqw=
github.com/appleboy/gin-jwt/v2 v2.6.3 h1:aK4E3DjihWEBUTjEeRnGkA5nUkmwJPL1CPonMa2usRs=
github.com/appleboy/gin-jwt/v2 v2.6.3/go.mod h1:MfPYA4ogzvOcVkRwAxT7quHOtQmVKDpTwxyUrC2DNw0=
github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw=
github.com/aws/aws-sdk-go v1.29.15 h1:0ms/213murpsujhsnxnNKNeVouW60aJqSd992Ks3mxs=
github.com/aws/aws-sdk-go v1.29.15/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M=
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk=
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc h1:n+nNi93yXLkJvKwXNP9d55HC7lGK4H/SRcwB5IaUZLo=
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
go.mongodb.org/mongo-driver v1.4.0 h1:C8rFn1VF4GVEM/rG+dSoMmlm2pyQ9cs2/oRtUATejRU=
go.mongodb.org/mongo-driver v1.4.0/go.mod h1:llVBH2pkj9HywK0Dtdt6lDikOjFLbceHVu/Rc0iMKLs=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
#!/bin/bash
go mod init github.com/Debzou/REST-API-GO
go mod vendor
go get
docker-compose up
// define package name
package controllers
// import library
import(
"time"
"context"
"github.com/gin-gonic/gin"
"github.com/Debzou/REST-API-GO/internal/models"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/bson"
"net/http"
"log"
)
// DATABASE INSTANCE
var collection2 *mongo.Collection
// define the collection
func ConsumptionCollection(c *mongo.Database) {
collection2 = c.Collection("consumption")
}
// Post Ecolyo consumption in mongodb
func PostConsumption(c *gin.Context) {
var json models.Consumption
c.Bind(&json)
ctx, cancel:= context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
collection2.InsertOne(ctx, json)
// display message & httpstatus
c.JSON(http.StatusOK, gin.H{"message": "An user consumption is posted"})
return
}
func GetAllConsumption(c *gin.Context) {
// init table consumption structure
var results []models.Consumption
var consumption models.Consumption
// define the context
ctx, cancel:= context.WithTimeout(context.Background(), 10*time.Second)
defer cancel() // releases resources if slowOperation completes before timeout elapses
// find all consumption
cursor, err := collection2.Find(ctx, bson.D{})
if err != nil {
c.JSON(http.StatusNoContent, gin.H{"message": "err"})
panic(err)
} else {
for cursor.Next(ctx) {
// decode the document
if err := cursor.Decode(&consumption); err != nil {
log.Fatal(err)
}
// add in table
results =append(results, consumption)
}
c.JSON(http.StatusOK, gin.H{"data": results})
}
}
// define package name
package controllers
// import library
import(
"time"
"context"
"github.com/gin-gonic/gin"
"github.com/Debzou/REST-API-GO/internal/models"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/bson"
"log"
"golang.org/x/crypto/bcrypt"
"strings"
"net/http"
)
// DATABASE INSTANCE
var collection *mongo.Collection
// define the collection
func UserCollection(c *mongo.Database) {
collection = c.Collection("users")
}
func CreateUser(c *gin.Context) {
var json models.User
c.Bind(&json) // This will infer what binder to use depending on the content-type header.
// gather username and transform to lower case
username := strings.ToLower(json.Username)
//hash password
hashpassword, err := HashPassword(json.Password)
if err != nil {
log.Printf("Error, Reason: %v\n", err)
}
// create with models an user
user := models.User{Username: username,
Password: hashpassword,
Status: "normal_user"}
// check if username exist
if (isExist(username)){
// username already exist
c.JSON(http.StatusOK, gin.H{"message": "User already exist"})
return
}else{
// post user in mongodb (username no exist)
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
collection.InsertOne(ctx, user)
// display message & httpstatus
c.JSON(http.StatusOK, gin.H{"message": "User is created"})
return
}
}
// return true if authenticate is true and the status value
func AuthUser(username string,password string) (bool,string){
// init user structure
user := models.User{}
// define the context
ctx, cancel:= context.WithTimeout(context.Background(), 10*time.Second)
defer cancel() // releases resources if slowOperation completes before timeout elapses
// check if user exist
err := collection.FindOne(ctx, bson.M{"username": username}).Decode(&user)
if err != nil {
log.Printf("Error, Reason: %v\n", err)
return false,"no_status"
}
// check the password
if !(CheckPasswordHash(password, user.Password)) {
log.Printf("incorrect password")
return false,"incorrect_pass"
}
return true,user.Status
}
func isExist(username string) bool{
// init user structure
user := models.User{}
// define the context
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel() // releases resources if slowOperation completes before timeout elapses
// find an user
err := collection.FindOne(ctx,bson.M{"username": username}).Decode(&user)
// the user exist
if err != nil {
log.Printf("Error, Reason: %v\n", err)
return false
// the user not exist
}else{
return true
}
}
// hash password
func HashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
// compare hash password with password
func CheckPasswordHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
\ No newline at end of file
// package name
package controllers
// import library
import(
"net/http"
"github.com/gin-gonic/gin"
)
func Getindex(c *gin.Context) {
c.HTML(http.StatusOK, "Index.tmpl", gin.H{
"Page": "Home",
})
}
func GetGeoVis(c *gin.Context) {
c.HTML(http.StatusOK, "Index.tmpl", gin.H{
"Page": "GeoVis",
})
}
\ No newline at end of file
package controllers
import (
"github.com/appleboy/gin-jwt/v2"
"github.com/gin-gonic/gin"
)
// jwt user intentification
var IdentityKey = "id"
// After auth, display a message
func HelloHandler(c *gin.Context) {
claims := jwt.ExtractClaims(c)
c.JSON(200, gin.H{
"status": claims[IdentityKey],
"text": "Welcome is api. You are authenticate",
})
}
// package name
package middleware
// library imported
import (
"time"
"github.com/appleboy/gin-jwt/v2"
"github.com/gin-gonic/gin"
"github.com/Debzou/REST-API-GO/internal/controllers"
"github.com/Debzou/REST-API-GO/internal/models"
)
// define the key
var IdentityKey = "id"
// the jwt middleware
var AuthMiddleware, Err = jwt.New(&jwt.GinJWTMiddleware{
// jwt option
Realm: "DebzouAPI",
Key: []byte("DebzouKeyDebzouCorp"),
Timeout: time.Hour,
MaxRefresh: time.Hour,
IdentityKey: IdentityKey,
// define value in jwt
PayloadFunc: func(data interface{}) jwt.MapClaims {
if v, ok := data.(*models.TokenInfoUser); ok {
return jwt.MapClaims{
IdentityKey: v.Status,
}
}
return jwt.MapClaims{}
},
IdentityHandler: func(c *gin.Context) interface{} {
claims := jwt.ExtractClaims(c)
return &models.TokenInfoUser{
Status: claims[IdentityKey].(string),
}
},
// authenticate , give a jwt
// token info : status
Authenticator: func(c *gin.Context) (interface{}, error) {
var loginVals models.Login
c.Bind(&loginVals) // This will infer what binder to use depending on the content-type header.
username := loginVals.Username
password := loginVals.Password
condition,status := controllers.AuthUser(username,password)
if (condition) {
return &models.TokenInfoUser{
Status: status,
UserName: username,
}, nil
}
return nil, jwt.ErrFailedAuthentication
},
// authorization
// if the status is not admin, then you won't be able to use the protected routes.
Authorizator: func(data interface{}, c *gin.Context) bool {
v, ok := data.(*models.TokenInfoUser)
if ok && v.Status == "admin" {
return true
}
return false
},
// else
Unauthorized: func(c *gin.Context, code int, message string) {
c.JSON(code, gin.H{
"code": code,
"message": message,
})
},
TokenLookup: "header: Authorization, query: token, cookie: jwt",
TokenHeadName: "Bearer",
TimeFunc: time.Now,
})
\ No newline at end of file
// package name
package models
// lirary imported
import (
)
// consumption user (ECOLYO)
type Consumption struct {
Pseudo string `form:"pseudo" json:"pseudo"`
Latitude float64 `form:"latitude" json:"latitude"`
Longitude float64 `form:"longitude" json:"longitude"`
AverageDailyConsumption float64 `form:"averageDailyConsumption" json:"averageDailyConsumption"`
AverageMonthlyConsumption float64 `form:"averageMonthlyConsumption" json:"averageMonthlyConsumption"`
AverageAnnualConsumption float64 `form:"averageAnnualConsumption" json:"averageAnnualConsumption"`
}
\ No newline at end of file
// package name
package models
// lirary imported
import (
)
// user structure (document in mongodb)
type User struct {
Username string `form:"username" json:"username"`
Password string `form:"password" json:"password"`
Status string `form:"status" json:"status"`
}
// login structure
type Login struct {
Username string `form:"username" json:"username" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
}
// User token info
type TokenInfoUser struct {
Status string
UserName string
}
\ No newline at end of file
{{define "Footer"}}
<footer id="footer">
<div class="content has-text-centered footer_text">
<div class="row">&#8226; David PETIT
<a class="git_logo" href="https://github.com/Debzou"><i class="fab fa-github"></i></a>
</div>
</div>
</footer>
{{end}}
\ No newline at end of file
{{define "GeoVis"}}
<!--leafletjs.com -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css"
integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
crossorigin=""/>
<!-- Make sure you put this AFTER Leaflet's CSS -->
<script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"
integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
crossorigin=""></script>
<!-- view -->
<section class="section">
<div class="container">
<div class="notification">
<p>GeoVis</p>
<!-- dropdown -->
<label for="consumption">Choose the granularity : </label>
<select class="consumption" id="consumption">
<option value="averageMonthlyConsumption">Monthly</option>
<option value="averageAnnualConsumption">Annual</option>
<option value="averageDailyConsumption">Daily</option>
</select>
<br><br>
<div id="mapid"></div>
</div>
</div>
</section>
<!--script map -->
<script type="text/javascript" src="/static/js/utils.js"></script>
<script>
// consumption data
var consumption
// marker & layers
var markers = [];
var markersLayer = new L.LayerGroup(); // NOTE: Layer is created here!
// define map & init map
var mymap = L.map('mapid').setView([45.7578137, 4.8320114], 12);
L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
maxZoom: 18,
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
id: 'mapbox/streets-v11',
tileSize: 512,
zoomOffset: -1
}).addTo(mymap);
// selector
$(document).ready(function(){
$("select.consumption").change(function(){
// dropdown selector
let selected = $(this).children("option:selected").val();
// clear marker
markersLayer.clearLayers();
// change marker
consumption.forEach(function (datum){
// define color
let value = datum[selected]
let colorCircle = color(value)
// create circle
let circle = L.circle([datum.latitude,datum.longitude], {
color: colorCircle,
fillColor: colorCircle,
fillOpacity: 0.5,
radius: 200
});
circle.bindPopup(`<b>${datum.pseudo}</b><br><p>${selected} : ${datum[selected]}</p>`);
// display marker
markersLayer.addLayer(circle);
})
markersLayer.addTo(mymap);
});
});
// gather consumption
$.get( "/allconsumption", function(data) {
consumption = data.data
data.data.forEach(function (datum){
let value = datum.averageMonthlyConsumption
let colorCircle = color(value)
let circle = L.circle([datum.latitude,datum.longitude], {
color: colorCircle,
fillColor: colorCircle,
fillOpacity: 0.5,
radius: 200
});
circle.bindPopup(`<b>${datum.pseudo}</b><br><p>averageMonthlyConsumption : ${datum['averageMonthlyConsumption']}</p>`);
markersLayer.addLayer(circle);
})
markersLayer.addTo(mymap);
console.log(data.data[0]);
});
</script>
{{end}}
\ No newline at end of file
{{define "Home"}}
<section class="section">
<div class="container">
<div class="notification">
<p>Home</p>
</div>
</div>
</section>
{{end}}
\ No newline at end of file
<html>
<head>
<meta charset="UTF-8">
<!-- bulma css -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css">
<!-- static css file -->
<link rel="stylesheet" href="/static/styles/index.css">
<!-- icone -->
<script defer src="https://use.fontawesome.com/releases/v5.10.1/js/all.js"></script>
<!-- jQuery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<!-- nav bar -->
<nav class="navbar is-fixed-top nav">
<div class="navbar-brand">
<a class="navbar-item" href="/datavis/index">
<i class="fas fa-jedi navitem"></i>
</a>
<div class="navbar-burger burger" data-target="navbarTarget">
<span></span>
<span></span>
<span></span>
</div>
</div>
<div id="navbarTarget" class="navbar-menu" >
<div class="navbar-start">
<a class="navbar-item navitem" href="/datavis/index">
Home
</a>
<a class="navbar-item navitem" href="/datavis/geovis">
Geo visualisation
</a>
</div>
</div>
</nav>
<body id="page-container">
{{if (eq .Page "Home")}}
{{template "Home"}}
{{else if (eq .Page "GeoVis")}}
{{template "GeoVis"}}
{{else}}
<p>Something is wrong ?!</p>
{{end}}
{{template "Footer"}}
</body>
<script>
document.addEventListener('DOMContentLoaded', () => {
// Get all "navbar-burger" elements
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
// Check if there are any navbar burgers
if ($navbarBurgers.length > 0) {
// Add a click event on each of them
$navbarBurgers.forEach(el => {
el.addEventListener('click', () => {
// Get the target from the "data-target" attribute
const target = el.dataset.target;
const $target = document.getElementById(target);
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
el.classList.toggle('is-active');
$target.classList.toggle('is-active');
});
});
// Simulate a click on the burger to close the mobile navbar
const $navbarBurgerModes = Array.prototype.slice.call(document.querySelectorAll('.navitem'), 0);
$navbarBurgerModes.forEach(el => {
el.addEventListener('click', () => {
document.getElementById("navbarBurger").click();
});
});
}
});
</script>
</html>
\ No newline at end of file
main.go 0 → 100644
// the main package
package main
// library imported
import (
"log"
"net/http"
"os"
"time"
"context"
"fmt"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"github.com/appleboy/gin-jwt/v2"
"github.com/gin-gonic/gin"
"github.com/Debzou/REST-API-GO/internal/controllers"
"github.com/Debzou/REST-API-GO/internal/middleware"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
// define client mongo
var client *mongo.Client
var errMongo *mongo.Client
func main() {
fmt.Println("Starting the application ...<3")
// mongodb context
ctx, cancel:= context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// define the mongo client
// without docker you must be use this url --> mongodb://127.0.0.1:27017
// with docker you must be use this url --> mongodb://mongo:27017/
clientOptions := options.Client().ApplyURI("mongodb://127.0.0.1:27017")
client, errMongo := mongo.Connect(ctx, clientOptions)
// errMongo
if errMongo != nil {
panic(errMongo)
}
defer func() {
if errMongo = client.Disconnect(ctx); errMongo != nil {
panic(errMongo)
}
}()
// Ping the primary
if errMongo := client.Ping(ctx, readpref.Primary()); errMongo != nil {
log.Fatal("err ping mongo")
panic(errMongo)
}
database := client.Database("RESTapi")
// define collection
controllers.UserCollection(database)
controllers.ConsumptionCollection(database)
// Start Gin
port := os.Getenv("PORT")
router := gin.New()
router.Use(gin.Logger())
router.Use(gin.Recovery())
// view
router.LoadHTMLGlob("internal/views/*.tmpl")
// servers other static files
router.Static("/static", "./static")
// if port is not define
if port == "" {
port = "8080"
}
// ROUTE NOT PROTECTED
router.POST("/signup", controllers.CreateUser)
router.GET("/datavis/index",controllers.Getindex)
router.GET("/datavis/geovis",controllers.GetGeoVis)
router.GET("/allconsumption",controllers.GetAllConsumption)
if middleware.Err != nil {
log.Fatal("JWT Error:" + middleware.Err.Error())
}
// route auth
router.POST("/login", middleware.AuthMiddleware.LoginHandler)
router.NoRoute(middleware.AuthMiddleware.MiddlewareFunc(), func(c *gin.Context) {
claims := jwt.ExtractClaims(c)
log.Printf("NoRoute claims: %#v\n", claims)
c.JSON(404, gin.H{"code": "PAGE_NOT_FOUND", "message": "Page not found"})
})
auth := router.Group("/auth")
// Refresh time can be longer than token timeout
auth.GET("/refresh_token", middleware.AuthMiddleware.RefreshHandler)
auth.Use(middleware.AuthMiddleware.MiddlewareFunc())
{
// PROTECTED ROUTE
auth.GET("/hello", controllers.HelloHandler)
auth.POST("/consumption",controllers.PostConsumption)
}
if err := http.ListenAndServe(":"+port, router); err != nil {
log.Fatal(err)
}
}
\ No newline at end of file
static/images/logo.png

78.7 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment