go run main.go- Build the search model at http handler
- Build dynamic SQL for search
- Build SQL for paging by page index (page) and page size (limit)
- Build SQL to count total of records
 
In the below sample, search users with these criteria:
- get users of page "1", with page size "20"
- email="tony": get users with email starting with "tony"
- dateOfBirth between "min" and "max" (between 1953-11-16 and 1976-11-16)
- sort by phone ascending, id descending
{
    "page": 1,
    "limit": 20,
    "sort": "phone,-id",
    "email": "tony",
    "dateOfBirth": {
        "min": "1953-11-16T00:00:00+07:00",
        "max": "1976-11-16T00:00:00+07:00"
    }
}GET /users/search?page=1&limit=2&email=tony&dateOfBirth.min=1953-11-16T00:00:00+07:00&dateOfBirth.max=1976-11-16T00:00:00+07:00&sort=phone,-id
In this sample, search users with these criteria:
- get users of page "1", with page size "20"
- email="tony": get users with email starting with "tony"
- dateOfBirth between "min" and "max" (between 1953-11-16 and 1976-11-16)
- sort by phone ascending, id descending
- total: total of users, which is used to calculate numbers of pages at client
- list: list of users
{
    "list": [
        {
            "id": "ironman",
            "username": "tony.stark",
            "email": "[email protected]",
            "phone": "0987654321",
            "dateOfBirth": "1963-03-24T17:00:00Z"
        }
    ],
    "total": 1
}- GET: retrieve a representation of the resource
- POST: create a new resource
- PUT: update the resource
- PATCH: perform a partial update of a resource, refer to core-go/core and core-go/sql
- DELETE: delete a resource
To check if the service is available.
{
    "status": "UP",
    "details": {
        "sql": {
            "status": "UP"
        }
    }
}[
    {
        "id": "spiderman",
        "username": "peter.parker",
        "email": "[email protected]",
        "phone": "0987654321",
        "dateOfBirth": "1962-08-25T16:59:59.999Z"
    },
    {
        "id": "wolverine",
        "username": "james.howlett",
        "email": "[email protected]",
        "phone": "0987654321",
        "dateOfBirth": "1974-11-16T16:59:59.999Z"
    }
]GET /users/wolverine{
    "id": "wolverine",
    "username": "james.howlett",
    "email": "[email protected]",
    "phone": "0987654321",
    "dateOfBirth": "1974-11-16T16:59:59.999Z"
}{
    "id": "wolverine",
    "username": "james.howlett",
    "email": "[email protected]",
    "phone": "0987654321",
    "dateOfBirth": "1974-11-16T16:59:59.999Z"
}1PUT /users/wolverine{
    "username": "james.howlett",
    "email": "[email protected]",
    "phone": "0987654321",
    "dateOfBirth": "1974-11-16T16:59:59.999Z"
}1Perform a partial update of user. For example, if you want to update 2 fields: email and phone, you can send the request body of below.
PATCH /users/wolverine{
    "email": "[email protected]",
    "phone": "0987654321"
}1DELETE /users/wolverine1- core-go/health: include HealthHandler, HealthChecker, SqlHealthChecker
- core-go/config: to load the config file, and merge with other environments (SIT, UAT, ENV)
- core-go/log: logging
- core-go/log/gin: middleware log tracing for gin
To check if the service is available, refer to core-go/health
{
    "status": "UP",
    "details": {
        "sql": {
            "status": "UP"
        }
    }
}To create health checker, and health handler
    db, err := sql.Open(cfg.Driver, cfg.DataSourceName)
    if err != nil {
        return nil, err
    }
    sqlChecker := s.NewSqlHealthChecker(db)
    healthHandler := health.NewHealthHandler(sqlChecker)To load the config from "config.yml", in "configs" folder
package main
import "github.com/core-go/config"
type Config struct {
    DB DatabaseConfig `mapstructure:"db"`
}
type DatabaseConfig struct {
    Driver         string `mapstructure:"driver"`
    DataSourceName string `mapstructure:"data_source_name"`
}
func main() {
    var cfg Config
    err := config.Load(&cfg, "configs/config")
    if err != nil {
        panic(err)
    }
}To configure to ignore the health check, use "skips":
middleware:
  skips: /health
