Go/GRPC codebase containing RealWorld examples (CRUD, auth, advanced patterns, etc) that adheres to the RealWorld spec and API.
This codebase was created to demonstrate a fully fledged fullstack application built with golang/grpc including CRUD operations, authentication, routing, pagination, and more.
-
Using grpc-gateway as reverse-proxy server which translates a RESTful JSON API into gRPC.
-
Using Go to implement realworld backend server.
-
Using MySQL to store data.
The app listens and serves on 0.0.0.0:3000
.
-
docker-compose
$ docker-compose up -d
-
local
- Install Go 1.19+, MySQL
- set environment variables to connect database like this.
$ go run server.go # run grpc server $ go run gateway/gateway.go # run grpc-gateway server
-
docker-compose
$ docker-compose run app make unittest
-
local
$ make unittest
$ make e2etest
-
Users and Authentication
-
POST /user/login
: Existing user login -
POST /users
: Register a new user -
GET /user
: Get current user -
PUT /user
: Update current user
-
-
Profiles
-
GET /profiles/{username}
: Get a profile -
POST /profiles/{username}/follow
: Follow a user -
DELETE /profiles/{username}/follow
: Unfollow a user
-
-
Articles
-
GET /articles/feed
: Get recent articles from users you follow -
GET /articles
: Get recent articles globally -
POST /articles
: Create an article -
GET /articles/{slug}
: Get an article -
PUT /articles/{slug}
: Update an article -
DELETE /articles/{slug}
: Delete an article
-
-
Comments
-
GET /articles/{slug}/comments
: Get comments for an article -
POST /articles/{slug}/comments
: Create a comment for an article -
DELETE /articles/{slug}/comments/{id}
: Delete a comment for an article
-
-
Favorites
-
POST /articles/{slug}/favorite
: Favorite an article -
DELETE /articles/{slug}/favorite
: Unfavorite an article
-
-
Deafult
-
GET /tags
: Get tags -
E2E test
┌─────────────────────────┬───────────────────┬───────────────────┐ │ │ executed │ failed │ ├─────────────────────────┼───────────────────┼───────────────────┤ │ iterations │ 1 │ 0 │ ├─────────────────────────┼───────────────────┼───────────────────┤ │ requests │ 31 │ 0 │ ├─────────────────────────┼───────────────────┼───────────────────┤ │ test-scripts │ 46 │ 0 │ ├─────────────────────────┼───────────────────┼───────────────────┤ │ prerequest-scripts │ 17 │ 0 │ ├─────────────────────────┼───────────────────┼───────────────────┤ │ assertions │ 345 │ 0 │ ├─────────────────────────┴───────────────────┴───────────────────┤ │ total run duration: 17.5s │ ├─────────────────────────────────────────────────────────────────┤ │ total data received: 8.73KB (approx) │ ├─────────────────────────────────────────────────────────────────┤ │ average response time: 33ms [min: 10ms, max: 150ms, s.d.: 31ms] │ └─────────────────────────────────────────────────────────────────┘