Developing a Web App with Gin framework, integrating it with psql DB and my GO HACK Hackathon Experience
Tags: webapp, restapi, go, psql
Published: 2022-05-26 07:58:36

#Introduction

Before I deep dive into the architecture of what I rebuilt an app during the hackathon, I would like to tell about my experiences in my words.
When I first came across #GO Hack Challenge on [devpost](https://gohack.devpost.com/), I was overwhelming to find related tracks which I could be fit for and tutorials to enrich my knowledge here and there to get into it. It was really a learning opportunity to someone who is newbie and wants to contribute or build any stuff under the hood. 
I stepped into the open source projects under [CERN Foundation](https://github.com/cs3org), where I didn’t even know what the ecosystem around the project is. I was much curious then. Next, I delved into one of the [projects](https://github.com/cs3org/reva) for a few days and looked into a few [issues](https://github.com/cs3org/reva/issues) and made a small contribution to it by fixing one of the [bugs](https://github.com/cs3org/reva/pull/2841). I moved to another track where we needed to build any app based on golang. I came to know about use of generic function which is currently released and used in Go >= 18 Version. I managed to rebuild an app using Gin-Gonic framework and use the generic function usage in my app.

Monolithic services architecture enables developers to develop product simpler and deploy easier, which can further help them achieve the product's needs sharply. This has also better development productivity ultimately. With that, I am going to give you a short demonstration on how to build a web app using monolithic way.

Well, this looks scary when you never heard about this architecture. But when you start building things on top of that, you can gradually understand the scope of this architecture i.e. when and how to use it. 
![api-conf](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0dzx3sly7ihkxwyxlnzt.png)
 
We take the resource management app as an example to build a monolithic service here. The app service is consists of multiple modules, the modules include add resource, get resource and login modules, etc. Each module will have its own independent business logic, and each module will also depend on some others. For example, the get resource (/resource/get-resc) module will depend on the login module. In the monolithic application this kind of dependency is usually accomplished by method calls between modules. Monolithic services generally share storage resources, such as MySQL but in our case, it is PSQL.

The overall architecture of monolithic services is relatively simple, which is also the advantage of monolithic services.

#Development

This section describes how to quickly implement a resource management app monolithic service based on gin framework of golang.
With this framework, we can quickly build, configure and deploy resources within a few commands. We can create and store our API’s and configuration in a centralized repository as many as possible.

###Getting Started

To get started, I would assume you have GOlang already installed and configured locally and the corresponding Go package of verion >=18 for this app. For more details, please follow the official docs. Once we set up the requirements, we will proceed with the next steps to play around GO gin pkg for apis and gorm pkg for database instance creations.

So, let’s install plugins and libraries step by step;

The below commands will clone basic templates for you to work with the API after you clone the [repo](https://github.com/Cloud-Hacks/go_hacks_resc_mgmnt_app). Plz, ignore the docker file for now.

After that install the dependencies as follows; this allows you to update the pkg installed.

`go mod download`

`go mod tidy`

Let’s dive into main.go file and create another file inside our `routes` dir.

####User and Resource model API definition

```go
type Resource struct {
	ID        int    `json:"id"`
	Title     string `json:"title"`
	Category  string `json:"category"`
	Status    string `json:"status"`
	Types     string `json:"types"`
	Content   string `json:"content"`
	FileLink  string `json:"file_link"`
	CreatedBy int    `json:"created_by"`
	CreatedAt int64  `json:"created_at"`
	UpdatedBy int    `json:"updated_by"`
	UpdatedAt int64  `json:"updated_at"`

type User struct {
	ID        int    `json:"id"`
	FirstName string `json:"first_name"`
	LastName  string `json:"last_name"`
	Password  string `json:"password"`
	Email     string `json:"email"`
	Role      string `json:"role"`
}

```

####Resource module API definition
```
Add Resource details -> resource/add-resource
View Resource details -> resource/get-resc
Login User -> resource/login
```

![routes](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vnlfs7lcl0g44wcimbo9.png)

Another way to handle http request through `http.HandleFunc` to support generic function here as shown below
![handlefunc and generic func](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4253wf8n2odhyfnydi7i.png)

To more about generic function, you can definitely check this [link](https://www.freecodecamp.org/news/generics-in-golang/) out.

Let's deep dive into [gorm pkg](https://gorm.io/docs/connecting_to_the_database.html#PostgreSQL) and psql pkg a little bit now.

Since we are focusing here PostgreSql, we look into that sql query managed by that as shown below;
In order to execute the program, you need to have psql installed in your system:

Using Linux env and running on its terminal:

```
sudo apt install postgresql -> installs the psql

sudo -u postgres psql -> sudo into user name as postgress

psql --version -> checks version

export RESC_DB_DSN='postgres://USER_NAME:YOUR_PWD@localhost/DB_NAME' psql $RESC_DB_DSN

psql --host=localhost --dbname=DB_NAME --username=USER_NAME
```
![gorm-psql](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fts77dcnelp4b7kkerq.png)
 
I hope we are done with the `psql` creation and its usage through `gorm` pkg.

Let's run the App using ` go run main.go `, then using POSTMAN API Client or `curl` command you can go ahead request the body.
`curl localhost:8080/resource/get-resource`
![g-hack](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9m8dvkw0js3hbart7r4v.png)

####Using Postman
![using-postman](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xae2l1b4pvuuvmy3a2wj.png)
 
#What’s next!

I am looking forward to adding more API endpoints to make use of HTTP requests persistently and integrating with kubernetes cluster

#Summary
The above walk-through shows that it is very simple to use go-gin gonic framework to develop monolithic services. You only need to define the api file, and then the goctl tool can automatically generate the project code. We only need to fill in the business logic code in the logic package. In this article, I just demonstrated how to quickly develop monolithic services based on go-gin, gorm pkgs and generic function. Hope, you find it insightful and adopt the usage in building your app.