Code Monkey home page Code Monkey logo

gin-boilerplate's Introduction

alt tag

License GitHub release (latest by date) Go Version DB Version DB Version

Build Status Go Report Card

Join the chat at https://gitter.im/Massad/gin-boilerplate

Welcome to Golang Gin boilerplate v2

The fastest way to deploy a restful api's with Gin Framework with a structured project that defaults to PostgreSQL database and JWT authentication middleware stored in Redis

Configured with

  • go-gorp: Go Relational Persistence
  • jwt-go: JSON Web Tokens (JWT) as middleware
  • go-redis: Redis support for Go
  • Go Modules
  • Built-in Custom Validators
  • Built-in CORS Middleware
  • Built-in RequestID Middleware
  • Feature PostgreSQL 12 with JSON/JSONB queries & trigger functions
  • SSL Support
  • Environment support
  • Unit test
  • And few other important utilties to kickstart any project

Installation

$ go get github.com/Massad/gin-boilerplate
$ cd $GOPATH/src/github.com/Massad/gin-boilerplate
$ go mod init
$ go install

You will find the database.sql in db/database.sql

And you can import the postgres database using this command:

$ psql -U postgres -h localhost < ./db/database.sql

Tip:

You will find that we added 2 trigger functions to the dabatase:

  • public.created_at_column()
  • public.update_at_column()

Those are added to the updated_at and created_at columns to update the latest timestamp automatically in both user and article tables. You can explore the tables and public schema for more info.

Running Your Application

Rename .env_rename_me to .env and place your credentials

$ mv .env_rename_me .env

Generate SSL certificates (Optional)

If you don't SSL now, change SSL=TRUE to SSL=FALSE in the .env file

$ mkdir cert/
$ sh generate-certificate.sh

Make sure to change the values in .env for your databases

$ go run *.go

Building Your Application

$ go build -v
$ ./gin-boilerplate

Testing Your Application

$ go test -v ./tests/*

Import Postman Collection (API's)

Download Postman -> Import -> Import From Link

https://www.postman.com/collections/7f941b400a88ddd9c137

Includes the following:

  • User
    • Login
    • Register
    • Logout
  • Article
    • Create
    • Update
    • Get Article
    • Get Articles
    • Delete
  • Auth
    • Refresh Token

In Login request in Tests tab:

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);

    var jsonData = JSON.parse(responseBody);
    pm.globals.set("token", jsonData.token.access_token);
    pm.globals.set("refresh_token", jsonData.token.refresh_token);

});

It captures the access_token from the success login in the global variable for later use in other requests.

Also, you will find in each request that needs to be authenticated you will have the following:

Authorization -> Bearer Token with value of {{token}}

It's very useful when you want to test the APIs in Postman without copying and pasting the tokens.

On You

You will need to implement the refresh_token mechanism in your application (Frontend).

We have the /v1/token/refresh API here to use it.

For example:

If the API sends 401 Status Unauthorized, then you can send the refresh_token that you stored it before from the Login API in POST /v1/token/refresh to receive the new access_token & refresh_token and store them again. Now, if you receive an error in refreshing the token, that means the user will have to Login again as something went wrong.

That's just an example, of course you can implement your own way.

Version 1

No longer supported

You will find the last update on v1 in v1-session-cookies-auth branch or v1.0.5 release that supported the authentication using the session and cookies stored in Redis if needed.

  • RedisStore: Gin middleware for session management with multi-backend support (currently cookie, Redis).

Contribution

You are welcome to contribute to keep it up to date and always improving!

If you have any question or need help, drop a message at https://gitter.im/Massad/gin-boilerplate

Credit

The implemented JWT inspired from this article: Using JWT for Authentication in a Golang Application worth reading it, thanks Victor Steven


License

(The MIT License)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

gin-boilerplate's People

Contributors

anshuman-agarwala avatar billmakes avatar brian926 avatar defp avatar gitter-badger avatar kaansk avatar krolow avatar luckspt avatar massad avatar testwill avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gin-boilerplate's Issues

Ho to implement authentication?

I'm wondering if I save JWT as httpOnly cookie in browser,will it be secure enough? Or do I need to implement an extra anti-CSRF token to each form?
A sample user user authentication/authorization code will be much appreciated.

How to actually run the app

So, I installed the database and everything, and it's connected, but there doesn't seem to be any UI...is that an exercise left to the reader?

Adding article's Tags - request

I wanna use your great boilerplate, but because I'm a newbie Golang developer I have a request, can you please add Tags relationship for the articles. I wanna see how can I implement such things for my demo Restful APIs.

Build fails due to myesui/uuid

It looks like the repo https://github.com/myesui/uuid is now missing and https://github.com/twinj/uuid looks to be dependent on it. Thus, some fun errors occur with the modules and when trying to build.

        remote: Repository not found.
        fatal: repository 'https://github.com/myesui/uuid/' not found

An easy solution seems to be replacing https://github.com/twinj/uuid with https://github.com/google/uuid which has the same functionality.

Doesnt hit the create article endpoint

/**
* TestCreateArticleUnauthorized
* Test getting the article with unauthorized user (wrong or expired access_token)
*
* Must return response code 401
*/
func TestCreateArticleUnauthorized(t *testing.T) {
testRouter := SetupRouter()
req, err := http.NewRequest("GET", fmt.Sprintf("/v1/article/%d", articleID), nil)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", fmt.Sprintf("Bearer: %s", "abc123"))
if err != nil {
fmt.Println(err)
}
resp := httptest.NewRecorder()
testRouter.ServeHTTP(resp, req)
assert.Equal(t, resp.Code, http.StatusUnauthorized)
}

just a question

Probably a very basic and stupid question - but what is the main purpose of having forms and models? Why not to use just models?

Suggestions for improving gin-boilerplate

As some of the current dependencies are outdated or no longer maintained, gin-boilerplate could benefit from some changes to existing setup. What do you think of making these changes to gin-boilerplate?

  • Add OpenAPI 3.0 support through oapi-codegen for server code generation and documentation support.
  • Replace go-gorp/gorp and pq with sqlc, pgx and use atlas for DB migrations.
    • gorp seems to no longer be maintained as no commits has been made since last year, and pgx is a better maintained alternative than pq these days.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.