├── public └── .gitkeep ├── storage └── .gitkeep ├── vendor ├── app │ ├── forms │ │ └── .gitkeep │ ├── models │ │ ├── .gitkeep │ │ ├── profile │ │ │ └── profile.go │ │ └── user │ │ │ └── user.go │ ├── transformers │ │ └── .gitkeep │ ├── tests │ │ └── welcome_test.go │ ├── config │ │ └── config.go │ ├── migrations │ │ ├── users.go │ │ ├── profiles.go │ │ └── migrations.go │ ├── controllers │ │ ├── users │ │ │ └── users.go │ │ └── welcome │ │ │ └── welcome.go │ ├── helpers │ │ ├── response │ │ │ └── response.go │ │ ├── console │ │ │ └── console.go │ │ └── general │ │ │ └── general.go │ ├── middlewares │ │ ├── example │ │ │ └── example.go │ │ └── cors │ │ │ └── cors.go │ ├── routes │ │ └── routes.go │ └── database │ │ └── database.go └── vendor.json ├── .env.example ├── .gitignore ├── cmd └── command.go ├── main.go ├── LICENSE.md └── README.md /public/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /storage/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/app/forms/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/app/models/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/app/transformers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/app/tests/welcome_test.go: -------------------------------------------------------------------------------- 1 | // +build all 2 | 3 | package tests 4 | 5 | -------------------------------------------------------------------------------- /vendor/app/config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "github.com/joho/godotenv" 5 | "log" 6 | ) 7 | 8 | func init() { 9 | err := godotenv.Load() 10 | if err != nil { 11 | log.Fatal("Error loading .env file") 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /vendor/app/migrations/users.go: -------------------------------------------------------------------------------- 1 | package migrations 2 | 3 | import "github.com/jinzhu/gorm" 4 | 5 | type Users struct { 6 | gorm.Model 7 | Username string `json:"username" gorm:"size:40"` 8 | Password string `json:"password" gorm:"size:80"` 9 | } 10 | -------------------------------------------------------------------------------- /vendor/app/migrations/profiles.go: -------------------------------------------------------------------------------- 1 | package migrations 2 | 3 | import "github.com/jinzhu/gorm" 4 | 5 | type Profiles struct { 6 | gorm.Model 7 | Bio string `json:"bio,omitempty" gorm:"size:255"` 8 | Age int `json:"age,omitempty" gorm:"size:5"` 9 | } 10 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Orchid micro 2 | APP_VERSION="1.0.0" 3 | APP_MODE=debug 4 | APP_PORT=8000 5 | 6 | DATABASE_DRIVER=mysql 7 | DATABASE_NAME= 8 | DATABASE_HOSTNAME=localhost 9 | DATABASE_PORT=3306 10 | DATABASE_USERNAME= 11 | DATABASE_PASSWORD= 12 | DATABASE_CHARSET="utf8" 13 | -------------------------------------------------------------------------------- /vendor/app/controllers/users/users.go: -------------------------------------------------------------------------------- 1 | package users 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/gin-gonic/gin" 7 | 8 | "app/models/user" 9 | ) 10 | 11 | func FetchUsers(c *gin.Context) { 12 | c.JSON(http.StatusOK, gin.H{"payload": user.FetchUsers(), "status": http.StatusOK}) 13 | } 14 | -------------------------------------------------------------------------------- /vendor/app/models/profile/profile.go: -------------------------------------------------------------------------------- 1 | package profile 2 | 3 | import "github.com/jinzhu/gorm" 4 | 5 | type Profiles struct { 6 | gorm.Model 7 | Name string `json:"name,omitempty"` 8 | Bio string `json:"bio,omitempty"` 9 | Age int `json:"age,omitempty"` 10 | UserId int `json:"user_id,omitempty"` 11 | } 12 | -------------------------------------------------------------------------------- /vendor/app/migrations/migrations.go: -------------------------------------------------------------------------------- 1 | package migrations 2 | 3 | import ( 4 | _ "app/config" 5 | "app/database" 6 | "app/helpers/console" 7 | ) 8 | 9 | func Migrate() { 10 | console.ConsoleSuccess("Migrating database") 11 | db := database.Connect() 12 | db.AutoMigrate(Users{}, Profiles{}) 13 | console.ConsoleSuccess("Migration completed!") 14 | } 15 | -------------------------------------------------------------------------------- /vendor/app/controllers/welcome/welcome.go: -------------------------------------------------------------------------------- 1 | package welcome 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/gin-gonic/gin" 7 | ) 8 | 9 | func Welcome(c *gin.Context) { 10 | c.JSON(http.StatusOK, gin.H{"message": "Welcome to Orchid-micro for GO lovers", "status": 2000}) 11 | } 12 | 13 | func Hello(c *gin.Context) { 14 | c.JSON(http.StatusOK, gin.H{"message": "You are requesting for some api..", "status": 2000}) 15 | } 16 | -------------------------------------------------------------------------------- /vendor/app/helpers/response/response.go: -------------------------------------------------------------------------------- 1 | package response 2 | 3 | type ResponseWithCollection struct { 4 | Status int `json:"status"` 5 | Data interface{} `json:"data"` 6 | } 7 | 8 | type ResponseWithSuccess struct { 9 | Status int `json:"status"` 10 | Success interface{} `json:"success"` 11 | } 12 | 13 | type ResponseWithError struct { 14 | Status int `json:"status"` 15 | Error interface{} `json:"error"` 16 | } 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files, Static and Dynamic libs (Shared Objects) 2 | *.o 3 | *.a 4 | *.so 5 | 6 | # Folders 7 | _obj 8 | _test 9 | 10 | # Architecture specific extensions/prefixes 11 | *.[568vq] 12 | [568vq].out 13 | 14 | *.cgo1.go 15 | *.cgo2.c 16 | _cgo_defun.c 17 | _cgo_gotypes.go 18 | _cgo_export.* 19 | 20 | _testmain.go 21 | 22 | *.exe 23 | *.test 24 | *.prof 25 | 26 | .idea 27 | debug 28 | glide.lock 29 | 30 | command 31 | vendor/* 32 | !vendor/app/ 33 | !vendor/vendor.json 34 | !vendor/govendor 35 | .env 36 | orchid-micro 37 | -------------------------------------------------------------------------------- /vendor/app/middlewares/example/example.go: -------------------------------------------------------------------------------- 1 | package example 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | "net/http" 6 | ) 7 | 8 | type response struct { 9 | Message string `json:"message"` 10 | Status int `json:"status"` 11 | } 12 | 13 | func Example() gin.HandlerFunc { 14 | return func(c *gin.Context) { 15 | if c.Request.Header.Get("Authorization") == "" { 16 | c.JSON(http.StatusUnauthorized, response{Message: "This route is protected by example middleware..", Status: 4001}) 17 | c.Abort() 18 | return 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /vendor/app/routes/routes.go: -------------------------------------------------------------------------------- 1 | package routes 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | 6 | "app/controllers/users" 7 | "app/controllers/welcome" 8 | "app/middlewares/cors" 9 | "app/middlewares/example" 10 | ) 11 | 12 | func InitRoutes(router gin.Engine) { 13 | //use middleware 14 | router.Use(cors.CORSMiddleware()) 15 | 16 | //root route 17 | router.GET("/", welcome.Welcome) 18 | router.GET("/users", users.FetchUsers) 19 | 20 | //route group 21 | v1 := router.Group("/api/v1").Use(example.Example()) 22 | { 23 | v1.GET("/", welcome.Hello) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /cmd/command.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "app/migrations" 5 | "app/helpers/console" 6 | "app/helpers/general" 7 | "fmt" 8 | "os" 9 | ) 10 | 11 | func main() { 12 | fmt.Println("Commands:") 13 | fmt.Println("\t0. Exit command mode") 14 | fmt.Println("\t1. Migrate database") 15 | fmt.Println("\t2. Make example migration") 16 | switch general.Scanner() { 17 | case "0": 18 | console.ConsoleWarning("Exited from command mode!") 19 | os.Exit(1) 20 | case "1": 21 | migrations.Migrate() 22 | case "2": 23 | fmt.Println("Another command") 24 | default: 25 | fmt.Println("Undefined command!") 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /vendor/app/helpers/console/console.go: -------------------------------------------------------------------------------- 1 | package console 2 | 3 | import ( 4 | "fmt" 5 | "strconv" 6 | ) 7 | 8 | func ConsoleSuccess(i interface{}) { 9 | fmt.Println("\x1b[32;1m" + ToString(i) + "\x1b[0m") 10 | } 11 | 12 | func ConsoleWarning(i interface{}) { 13 | fmt.Println("\x1b[33;1m" + ToString(i) + "\x1b[0m") 14 | } 15 | 16 | func ConsoleError(i interface{}) { 17 | fmt.Println("\x1b[31;1m" + ToString(i) + "\x1b[0m") 18 | } 19 | 20 | func ToString(i interface{}) string { 21 | switch i.(type) { 22 | case string: 23 | return i.(string) 24 | case int: 25 | return strconv.Itoa(i.(int)) 26 | default: 27 | return "" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /vendor/app/helpers/general/general.go: -------------------------------------------------------------------------------- 1 | package general 2 | 3 | import ( 4 | "bufio" 5 | "io" 6 | "os" 7 | ) 8 | 9 | func Scanner() string { 10 | scanner := bufio.NewScanner(os.Stdin) 11 | var str string 12 | for scanner.Scan() { 13 | str = scanner.Text() 14 | break 15 | } 16 | return str 17 | } 18 | 19 | func Copy(dst, src string) error { 20 | in, err := os.Open(src) 21 | if err != nil { 22 | return err 23 | } 24 | defer in.Close() 25 | out, err := os.Create(dst) 26 | if err != nil { 27 | return err 28 | } 29 | defer out.Close() 30 | _, err = io.Copy(out, in) 31 | cerr := out.Close() 32 | if err != nil { 33 | return err 34 | } 35 | return cerr 36 | } 37 | -------------------------------------------------------------------------------- /vendor/app/models/user/user.go: -------------------------------------------------------------------------------- 1 | package user 2 | 3 | import ( 4 | "app/database" 5 | "github.com/jinzhu/gorm" 6 | ) 7 | 8 | type Users struct { 9 | gorm.Model 10 | Username string `json:"username,omitempty"` 11 | Password string `json:"password,omitempty"` 12 | } 13 | 14 | type UsersWithProfile struct { 15 | Username string `json:"username"` 16 | Name string `json:"name"` 17 | Bio string `json:"bio"` 18 | } 19 | 20 | func FetchUsers() []UsersWithProfile { 21 | db := database.Connect() 22 | defer db.Close() 23 | users_with_profiles := []UsersWithProfile{} 24 | db.Table("users"). 25 | Select("users.username, profiles.name, profiles.bio"). 26 | Joins("left join profiles on profiles.user_id = users.id"). 27 | Scan(&users_with_profiles) 28 | return users_with_profiles 29 | 30 | } 31 | -------------------------------------------------------------------------------- /vendor/app/middlewares/cors/cors.go: -------------------------------------------------------------------------------- 1 | package cors 2 | 3 | import ( 4 | "fmt" 5 | "github.com/gin-gonic/gin" 6 | ) 7 | 8 | func CORSMiddleware() gin.HandlerFunc { 9 | return func(c *gin.Context) { 10 | c.Writer.Header().Set("Access-Control-Allow-Origin", "http://localhost") 11 | c.Writer.Header().Set("Access-Control-Max-Age", "86400") 12 | c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") 13 | c.Writer.Header().Set("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding, x-access-token") 14 | c.Writer.Header().Set("Access-Control-Expose-Headers", "Content-Length") 15 | c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") 16 | 17 | if c.Request.Method == "OPTIONS" { 18 | fmt.Println("OPTIONS") 19 | c.AbortWithStatus(200) 20 | } else { 21 | c.Next() 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | _ "app/config" 5 | "app/routes" 6 | "os" 7 | "runtime" 8 | 9 | "github.com/gin-contrib/static" 10 | "github.com/gin-gonic/gin" 11 | ) 12 | 13 | func main() { 14 | 15 | //set mode 16 | gin.SetMode(os.Getenv("APP_MODE")) //Caution: You must put the mode to "gin.ReleaseMode" when using in production 17 | 18 | //set the number of CPU processor will be used 19 | runtime.GOMAXPROCS(runtime.NumCPU()) 20 | 21 | //instantiate route 22 | router := gin.Default() 23 | 24 | //initialize the routes 25 | routes.InitRoutes(*router) 26 | 27 | //route not found response 28 | router.NoRoute(func(c *gin.Context) { 29 | message := map[string]interface{}{"message": "The requested uri is not valid!", "code": 4004} 30 | c.JSON(404, gin.H{"status": 404, "error": message}) 31 | return 32 | }) 33 | 34 | //serve static files 35 | router.Use(static.Serve("/", static.LocalFile("./public", true))) 36 | 37 | //start the server 38 | router.Run(":" + os.Getenv("APP_PORT")) 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Saddam H 4 | 5 | > Permission is hereby granted, free of charge, to any person obtaining a copy 6 | > of this software and associated documentation files (the "Software"), to deal 7 | > in the Software without restriction, including without limitation the rights 8 | > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | > copies of the Software, and to permit persons to whom the Software is 10 | > furnished to do so, subject to the following conditions: 11 | > 12 | > The above copyright notice and this permission notice shall be included in 13 | > all copies or substantial portions of the Software. 14 | > 15 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | > THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /vendor/app/database/database.go: -------------------------------------------------------------------------------- 1 | package database 2 | 3 | import ( 4 | "github.com/jinzhu/gorm" 5 | _ "github.com/jinzhu/gorm/dialects/mysql" //postgres/sqlite3 6 | "os" 7 | ) 8 | 9 | // Open returns a DB reference for a data source. 10 | func Connect() *gorm.DB { 11 | driverName := os.Getenv("DATABASE_DRIVER") 12 | connection := "" 13 | //check database driver //Note: This not a good practice. Highly encourage to do this initialization by yourself 14 | switch driverName { 15 | case "mysql": 16 | connection = os.Getenv("DATABASE_USERNAME") + ":" + os.Getenv("DATABASE_PASSWORD") + "@tcp(" + os.Getenv("DATABASE_HOST") + ":" + os.Getenv("DATABASE_PORT") + ")/" + os.Getenv("DATABASE_NAME") + "?charset=" + os.Getenv("DATABASE_CHARSET") + "&parseTime=True&loc=Local" 17 | case "postgres": 18 | connection = "host=" + os.Getenv("DATABASE_HOST") + ":" + os.Getenv("DATABASE_PORT") + "user=" + os.Getenv("DATABASE_USERNAME") + " dbname=" + os.Getenv("DATABASE_NAME") + " sslmode=disable password=" + os.Getenv("DATABASE_PASSWORD") 19 | case "sqlite3": 20 | connection = os.Getenv("DATABASE_HOST") 21 | } 22 | db, err := gorm.Open(driverName, connection) 23 | if err != nil { 24 | panic("failed to connect database") 25 | } 26 | return db 27 | } 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Orchid-micro 2 | ================= 3 | Golang boilerplate using gin-gonic framework and gorm for microservice 4 | 5 | ### Installation 6 | * Go to your `$GOPATH/src` and clone the directory using `git clone https://github.com/thedevsaddam/orchid.git` 7 | or [download the zip file](https://github.com/thedevsaddam/orchid-micro/archive/master.zip) 8 | 9 | * Install dependency manager `govendor` using the command below 10 | ``` 11 | go get -u github.com/kardianos/govendor 12 | ``` 13 | 14 | * Go to the `$GOPATH/src/orchid/vendor` directory and install dependencies using `govendor sync` command 15 | 16 | * Copy `.env.example` to `.env` and set your configurations. 17 | 18 | * Run `go build` to build binary file and to start the application use `./orchid` 19 | 20 | ### Todo 21 | - [ ] Job Queue 22 | - [ ] Caching 23 | - [ ] Localization 24 | - [ ] Helpers 25 | - [ ] OAuth2 server or JWT 26 | - [ ] Fixing inconsistent codes 27 | - [ ] Request validation 28 | - [ ] Security 29 | - [ ] Find out performance issues 30 | - [ ] Benchmarking 31 | 32 | ### Credits 33 | * Routing, middleware, route-group [gin-gonic](https://gin-gonic.github.io/gin) 34 | * Object-relational mapping [gorm](https://github.com/jinzhu/gorm) 35 | * Dependency management package [govendor](https://github.com/kardianos/govendor) 36 | * Environment management package [godotenv](https://github.com/joho/godotenv) 37 | 38 | ### License 39 | The **Orchid-micro** is a open-source software licensed under the [MIT License](LICENSE.md). 40 | -------------------------------------------------------------------------------- /vendor/vendor.json: -------------------------------------------------------------------------------- 1 | { 2 | "comment": "", 3 | "ignore": "", 4 | "package": [ 5 | { 6 | "path": "appengine/cloudsql", 7 | "revision": "" 8 | }, 9 | { 10 | "checksumSHA1": "WRu+mhZ2PfQu27qRr69HVGjtN4Q=", 11 | "path": "github.com/davecgh/go-spew/spew", 12 | "revision": "346938d642f2ec3594ed81d874461961cd0faa76", 13 | "revisionTime": "2016-10-29T20:57:26Z" 14 | }, 15 | { 16 | "checksumSHA1": "a2yC46a1qsJomgY6rb+FkTFiqmE=", 17 | "path": "github.com/davecgh/go-spew/spew/testdata", 18 | "revision": "346938d642f2ec3594ed81d874461961cd0faa76", 19 | "revisionTime": "2016-10-29T20:57:26Z" 20 | }, 21 | { 22 | "checksumSHA1": "Ukb2rsnVNFc7axfkasuwBIOK2IM=", 23 | "path": "github.com/denisenkom/go-mssqldb", 24 | "revision": "efb3002072bc69d12d92dfc70290ccfdaa5403cf", 25 | "revisionTime": "2017-03-07T22:49:21Z" 26 | }, 27 | { 28 | "checksumSHA1": "fyQ6D2LUvzhSnGxDSXPARWONPtg=", 29 | "path": "github.com/erikstmartin/go-testdb", 30 | "revision": "8d10e4a1bae52cd8b81ffdec3445890d6dccab3d", 31 | "revisionTime": "2016-02-19T21:45:06Z" 32 | }, 33 | { 34 | "checksumSHA1": "jN5KBEP/n3DSloi7vCO1I8Y52Ew=", 35 | "path": "github.com/gin-contrib/static", 36 | "revision": "986b610925a822771d6c475a6246ffa913085c7b", 37 | "revisionTime": "2017-03-15T11:49:17Z" 38 | }, 39 | { 40 | "checksumSHA1": "4YaKAmGadtGxXcbmooIUC64B4hM=", 41 | "path": "github.com/gin-gonic/contrib/static", 42 | "revision": "ffa12cf90b52a4af3ae604f6452e61f8218a517c", 43 | "revisionTime": "2017-02-26T15:24:26Z" 44 | }, 45 | { 46 | "checksumSHA1": "0z76T5x2iveCIDSl+VYVxYmdf1Y=", 47 | "path": "github.com/gin-gonic/gin", 48 | "revision": "e2212d40c62a98b388a5eb48ecbdcf88534688ba", 49 | "revisionTime": "2016-12-04T22:13:08Z" 50 | }, 51 | { 52 | "checksumSHA1": "uJ5EaItCWkwh8Cb8r/08HGV6tso=", 53 | "path": "github.com/gin-gonic/gin/binding", 54 | "revision": "e2212d40c62a98b388a5eb48ecbdcf88534688ba", 55 | "revisionTime": "2016-12-04T22:13:08Z" 56 | }, 57 | { 58 | "checksumSHA1": "v+H/cD17kjyZLCVSVc4hVle+Ydw=", 59 | "path": "github.com/gin-gonic/gin/binding/example", 60 | "revision": "e2212d40c62a98b388a5eb48ecbdcf88534688ba", 61 | "revisionTime": "2016-12-04T22:13:08Z" 62 | }, 63 | { 64 | "checksumSHA1": "pcOdY6zOlIYt+MBeMcNBXm/7r4w=", 65 | "path": "github.com/gin-gonic/gin/render", 66 | "revision": "e2212d40c62a98b388a5eb48ecbdcf88534688ba", 67 | "revisionTime": "2016-12-04T22:13:08Z" 68 | }, 69 | { 70 | "checksumSHA1": "LoYojhUneS1nEBnYaw5pl7f+h3g=", 71 | "path": "github.com/go-sql-driver/mysql", 72 | "revision": "2e00b5cd70399450106cec6431c2e2ce3cae5034", 73 | "revisionTime": "2016-12-24T12:10:19Z" 74 | }, 75 | { 76 | "checksumSHA1": "OVfqk5qyKVLHFirVbQOfxSkFBPo=", 77 | "path": "github.com/golang/protobuf/proto", 78 | "revision": "c9c7427a2a70d2eb3bafa0ab2dc163e45f143317", 79 | "revisionTime": "2017-03-07T00:15:33Z" 80 | }, 81 | { 82 | "checksumSHA1": "qyalT+838zrkZMjOA62VGus0VcI=", 83 | "path": "github.com/golang/protobuf/proto/proto3_proto", 84 | "revision": "c9c7427a2a70d2eb3bafa0ab2dc163e45f143317", 85 | "revisionTime": "2017-03-07T00:15:33Z" 86 | }, 87 | { 88 | "checksumSHA1": "hKyIpAqeYU2nAl/oXcpATnNaiBI=", 89 | "path": "github.com/golang/protobuf/proto/testdata", 90 | "revision": "c9c7427a2a70d2eb3bafa0ab2dc163e45f143317", 91 | "revisionTime": "2017-03-07T00:15:33Z" 92 | }, 93 | { 94 | "checksumSHA1": "AjyXQ5eohrCPS/jSWZFPn5E8wnQ=", 95 | "path": "github.com/golang/protobuf/protoc-gen-go/descriptor", 96 | "revision": "c9c7427a2a70d2eb3bafa0ab2dc163e45f143317", 97 | "revisionTime": "2017-03-07T00:15:33Z" 98 | }, 99 | { 100 | "checksumSHA1": "Y89zrH1jPTV2yIjp2JtYJ/v3e1s=", 101 | "path": "github.com/golang/protobuf/ptypes", 102 | "revision": "c9c7427a2a70d2eb3bafa0ab2dc163e45f143317", 103 | "revisionTime": "2017-03-07T00:15:33Z" 104 | }, 105 | { 106 | "checksumSHA1": "lZFWy27Qo6+m/keDjNFYTxSmvZw=", 107 | "path": "github.com/golang/protobuf/ptypes/any", 108 | "revision": "c9c7427a2a70d2eb3bafa0ab2dc163e45f143317", 109 | "revisionTime": "2017-03-07T00:15:33Z" 110 | }, 111 | { 112 | "checksumSHA1": "8gDNKfvEupesDdOCXio3AK/XVaA=", 113 | "path": "github.com/golang/protobuf/ptypes/duration", 114 | "revision": "c9c7427a2a70d2eb3bafa0ab2dc163e45f143317", 115 | "revisionTime": "2017-03-07T00:15:33Z" 116 | }, 117 | { 118 | "checksumSHA1": "sfoot+dHmmOgWZS6GJ5X79ClZM0=", 119 | "path": "github.com/golang/protobuf/ptypes/timestamp", 120 | "revision": "c9c7427a2a70d2eb3bafa0ab2dc163e45f143317", 121 | "revisionTime": "2017-03-07T00:15:33Z" 122 | }, 123 | { 124 | "checksumSHA1": "jnNrEJGmGrKqkcwvBLHpcEYxKOo=", 125 | "path": "github.com/jinzhu/gorm", 126 | "revision": "5409931a1bb87e484d68d649af9367c207713ea2", 127 | "revisionTime": "2017-02-22T00:28:20Z" 128 | }, 129 | { 130 | "checksumSHA1": "3uEFr3HV4Ecd7U5s42JhiA619lY=", 131 | "path": "github.com/jinzhu/gorm/dialects/mssql", 132 | "revision": "5409931a1bb87e484d68d649af9367c207713ea2", 133 | "revisionTime": "2017-02-22T00:28:20Z" 134 | }, 135 | { 136 | "checksumSHA1": "eECxSkwh0WmhLwaxHfkvcLOWS08=", 137 | "path": "github.com/jinzhu/gorm/dialects/mysql", 138 | "revision": "5409931a1bb87e484d68d649af9367c207713ea2", 139 | "revisionTime": "2017-02-22T00:28:20Z" 140 | }, 141 | { 142 | "checksumSHA1": "QmQW8snORAputB7/1jFXpsOZa8A=", 143 | "path": "github.com/jinzhu/gorm/dialects/postgres", 144 | "revision": "5409931a1bb87e484d68d649af9367c207713ea2", 145 | "revisionTime": "2017-02-22T00:28:20Z" 146 | }, 147 | { 148 | "checksumSHA1": "4VZ1gLZHMumRjV3fclS1aX8S1aQ=", 149 | "path": "github.com/jinzhu/gorm/dialects/sqlite", 150 | "revision": "5409931a1bb87e484d68d649af9367c207713ea2", 151 | "revisionTime": "2017-02-22T00:28:20Z" 152 | }, 153 | { 154 | "checksumSHA1": "cQzcRbyeocXC9PN7Lr4b7LRG3Yg=", 155 | "path": "github.com/jinzhu/inflection", 156 | "revision": "1c35d901db3da928c72a72d8458480cc9ade058f", 157 | "revisionTime": "2017-01-02T12:52:26Z" 158 | }, 159 | { 160 | "checksumSHA1": "YCCgRPYgjw5w9PKdkFhpNiPsLao=", 161 | "path": "github.com/jinzhu/now", 162 | "revision": "d939ba741945c047cac69c329c5fb0d6b4a06520", 163 | "revisionTime": "2017-02-12T11:26:55Z" 164 | }, 165 | { 166 | "checksumSHA1": "0jVdOJ1Kk5x76vwGXF3yQgTS4uE=", 167 | "path": "github.com/joho/godotenv", 168 | "revision": "d10b3fbe007de7a25e086524ad17597afa3d238b", 169 | "revisionTime": "2017-02-21T21:49:41Z" 170 | }, 171 | { 172 | "checksumSHA1": "yfKD0rpllr2JtMW8uB3ss6oJK9M=", 173 | "path": "github.com/lib/pq", 174 | "revision": "472a0745531a17dbac346e828b4c60e73ddff30c", 175 | "revisionTime": "2017-03-13T20:04:23Z" 176 | }, 177 | { 178 | "checksumSHA1": "fq3BmrkVu85eCtHFnngL8NIvjTo=", 179 | "path": "github.com/lib/pq/hstore", 180 | "revision": "472a0745531a17dbac346e828b4c60e73ddff30c", 181 | "revisionTime": "2017-03-13T20:04:23Z" 182 | }, 183 | { 184 | "checksumSHA1": "Gk3jTNQ5uGDUE0WMJFWcYz9PMps=", 185 | "path": "github.com/lib/pq/oid", 186 | "revision": "472a0745531a17dbac346e828b4c60e73ddff30c", 187 | "revisionTime": "2017-03-13T20:04:23Z" 188 | }, 189 | { 190 | "checksumSHA1": "MkWZiVGFCx8xuyIFygL7bOvKK2g=", 191 | "path": "github.com/manucorporat/sse", 192 | "revision": "ee05b128a739a0fb76c7ebd3ae4810c1de808d6d", 193 | "revisionTime": "2016-01-26T18:01:36Z" 194 | }, 195 | { 196 | "checksumSHA1": "xiboM3aeTebmyD7j6tl1psCJ+6o=", 197 | "path": "github.com/mattn/go-isatty", 198 | "revision": "57fdcb988a5c543893cc61bce354a6e24ab70022", 199 | "revisionTime": "2017-03-07T16:30:44Z" 200 | }, 201 | { 202 | "checksumSHA1": "1AyoZKcAZQFBiuSu2Zqt+2PBhGc=", 203 | "path": "github.com/mattn/go-sqlite3", 204 | "revision": "eac1dfa2a61ebccaa117538a5bb12044f6700cd0", 205 | "revisionTime": "2017-03-05T14:02:06Z" 206 | }, 207 | { 208 | "checksumSHA1": "vxP26s3TVOyaqMIREQxsvsxeeC8=", 209 | "path": "github.com/mattn/go-sqlite3/sqlite3_test", 210 | "revision": "eac1dfa2a61ebccaa117538a5bb12044f6700cd0", 211 | "revisionTime": "2017-03-05T14:02:06Z" 212 | }, 213 | { 214 | "checksumSHA1": "RZOdTSZN/PgcTqko5LzIAzw+UT4=", 215 | "path": "github.com/pmezard/go-difflib/difflib", 216 | "revision": "792786c7400a136282c1664665ae0a8db921c6c2", 217 | "revisionTime": "2016-01-10T10:55:54Z" 218 | }, 219 | { 220 | "checksumSHA1": "8rxOh1Vlti1bzoIy6mH5eL0RYsI=", 221 | "path": "github.com/stretchr/testify/assert", 222 | "revision": "4d4bfba8f1d1027c4fdbe371823030df51419987", 223 | "revisionTime": "2017-01-30T11:31:45Z" 224 | }, 225 | { 226 | "checksumSHA1": "Tgu4aZokVOcn5MgZQbPauSBNVLw=", 227 | "path": "golang.org/x/crypto/md4", 228 | "revision": "728b753d0135da6801d45a38e6f43ff55779c5c2", 229 | "revisionTime": "2017-01-24T01:46:54Z" 230 | }, 231 | { 232 | "checksumSHA1": "ujkdYz/AOSZ4dVskaUGW9g/V/dM=", 233 | "path": "golang.org/x/net/context", 234 | "revision": "a6577fac2d73be281a500b310739095313165611", 235 | "revisionTime": "2017-03-08T20:54:49Z" 236 | }, 237 | { 238 | "checksumSHA1": "N4WObJwRFBC6QDe67fHtXLnAAB4=", 239 | "path": "golang.org/x/sync/errgroup", 240 | "revision": "a60ad46e0ed33d02e09bda439efaf9c9727dbc6c", 241 | "revisionTime": "2017-02-16T18:55:22Z" 242 | }, 243 | { 244 | "checksumSHA1": "uJ12+5J5K0egflT72RWxUfcBXD0=", 245 | "path": "golang.org/x/sys/unix", 246 | "revision": "99f16d856c9836c42d24e7ab64ea72916925fa97", 247 | "revisionTime": "2017-03-08T15:04:45Z" 248 | }, 249 | { 250 | "checksumSHA1": "538I8ghUdvZa25NxgMUDpq14Qic=", 251 | "path": "gopkg.in/check.v1", 252 | "revision": "20d25e2804050c1cd24a7eea1e7a6447dd0e74ec", 253 | "revisionTime": "2016-12-08T18:13:25Z" 254 | }, 255 | { 256 | "checksumSHA1": "B6HgsgniYVjgDi8Jd6Tv41W6VR0=", 257 | "path": "gopkg.in/gin-gonic/gin.v1", 258 | "revision": "e2212d40c62a98b388a5eb48ecbdcf88534688ba", 259 | "revisionTime": "2016-12-04T22:13:08Z" 260 | }, 261 | { 262 | "checksumSHA1": "zBJo+aaK9GeFIUHftzL6CyxtYf0=", 263 | "path": "gopkg.in/go-playground/assert.v1", 264 | "revision": "4f4dfbc7d1c48336cf93399deae81aa9067e88af", 265 | "revisionTime": "2016-02-05T15:04:13Z" 266 | }, 267 | { 268 | "checksumSHA1": "24wxwYO57BWvjPPSmCmWNFmmkv8=", 269 | "path": "gopkg.in/go-playground/validator.v8", 270 | "revision": "5f57d2222ad794d0dffb07e664ea05e2ee07d60c", 271 | "revisionTime": "2016-07-18T13:41:25Z" 272 | }, 273 | { 274 | "checksumSHA1": "/0kOHaD3bhhN1GjmZajSigSqu4E=", 275 | "path": "gopkg.in/yaml.v2", 276 | "revision": "a3f3340b5840cee44f372bddb5880fcbc419b46a", 277 | "revisionTime": "2017-02-08T14:18:51Z" 278 | } 279 | ], 280 | "rootPath": "orchid-micro" 281 | } 282 | --------------------------------------------------------------------------------