├── README.md ├── .DS_Store ├── model ├── response.go └── product.go ├── Dockerfile ├── docker-compose.yml ├── db └── conn.go ├── cmd └── main.go ├── usecase └── product_usecase.go ├── go.mod ├── controller └── product_controller.go ├── repository └── product_repository.go └── go.sum /README.md: -------------------------------------------------------------------------------- 1 | # go-api 2 | A simple API in go 3 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mariarobertap/go-api/HEAD/.DS_Store -------------------------------------------------------------------------------- /model/response.go: -------------------------------------------------------------------------------- 1 | package model 2 | 3 | type Response struct { 4 | Message string 5 | } 6 | -------------------------------------------------------------------------------- /model/product.go: -------------------------------------------------------------------------------- 1 | package model 2 | 3 | type Product struct { 4 | ID int `json:"id_product"` 5 | Name string `json:"name"` 6 | Price float64 `json:"price"` 7 | } 8 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.18 2 | 3 | # set working directory 4 | WORKDIR /go/src/app 5 | 6 | # Copy the source code 7 | COPY . . 8 | 9 | #EXPOSE the port 10 | EXPOSE 8000 11 | 12 | # Build the Go app 13 | RUN go build -o main cmd/main.go 14 | 15 | # Run the executable 16 | CMD ["./main"] -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | 3 | services: 4 | go-app: 5 | container_name: go-app 6 | image: go-api-tutorial 7 | build: . 8 | ports: 9 | - "8000:8000" 10 | depends_on: 11 | - go_db 12 | go_db: 13 | container_name: go_db 14 | image: postgres:12 15 | environment: 16 | POSTGRES_PASSWORD: 1234 17 | POSTGRES_USER: postgres 18 | POSTGRES_DB: postgres 19 | ports: 20 | - "5432:5432" 21 | volumes: 22 | - pgdata:/var/lib/postgresql/data 23 | 24 | volumes: 25 | pgdata: {} -------------------------------------------------------------------------------- /db/conn.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "database/sql" 5 | "fmt" 6 | 7 | _ "github.com/lib/pq" 8 | ) 9 | 10 | const ( 11 | host = "go_db" 12 | port = 5432 13 | user = "postgres" 14 | password = "1234" 15 | dbname = "postgres" 16 | ) 17 | 18 | func ConnectDB() (*sql.DB, error) { 19 | psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+ 20 | "password=%s dbname=%s sslmode=disable", 21 | host, port, user, password, dbname) 22 | db, err := sql.Open("postgres", psqlInfo) 23 | if err != nil { 24 | panic(err) 25 | } 26 | 27 | err = db.Ping() 28 | if err != nil { 29 | panic(err) 30 | } 31 | 32 | fmt.Println("Connected to " + dbname) 33 | 34 | return db, nil 35 | } 36 | -------------------------------------------------------------------------------- /cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "go-api/controller" 5 | "go-api/db" 6 | "go-api/repository" 7 | "go-api/usecase" 8 | 9 | "github.com/gin-gonic/gin" 10 | ) 11 | 12 | func main() { 13 | 14 | server := gin.Default() 15 | 16 | dbConnection, err := db.ConnectDB() 17 | if err != nil { 18 | panic(err) 19 | } 20 | 21 | //Camada de repository 22 | ProductRepository := repository.NewProductRepository(dbConnection) 23 | //Camada usecase 24 | ProductUseCase := usecase.NewProductUseCase(ProductRepository) 25 | //Camada de controllers 26 | ProductController := controller.NewProductController(ProductUseCase) 27 | 28 | server.GET("/ping", func(ctx *gin.Context) { 29 | ctx.JSON(200, gin.H{ 30 | "message": "pong", 31 | }) 32 | }) 33 | 34 | server.GET("/products", ProductController.GetProducts) 35 | server.POST("/product", ProductController.CreateProduct) 36 | server.GET("/product/:productId", ProductController.GetProductById) 37 | 38 | server.Run(":8000") 39 | 40 | } 41 | -------------------------------------------------------------------------------- /usecase/product_usecase.go: -------------------------------------------------------------------------------- 1 | package usecase 2 | 3 | import ( 4 | "go-api/model" 5 | "go-api/repository" 6 | ) 7 | 8 | type ProductUsecase struct { 9 | repository repository.ProductRepository 10 | } 11 | 12 | func NewProductUseCase(repo repository.ProductRepository) ProductUsecase { 13 | return ProductUsecase{ 14 | repository: repo, 15 | } 16 | } 17 | 18 | func (pu *ProductUsecase) GetProducts() ([]model.Product, error) { 19 | return pu.repository.GetProducts() 20 | } 21 | 22 | func (pu *ProductUsecase) CreateProduct(product model.Product) (model.Product, error) { 23 | 24 | productId, err := pu.repository.CreateProduct(product) 25 | if err != nil { 26 | return model.Product{}, err 27 | } 28 | 29 | product.ID = productId 30 | 31 | return product, nil 32 | } 33 | 34 | func (pu *ProductUsecase) GetProductById(id_product int) (*model.Product, error) { 35 | 36 | product, err := pu.repository.GetProductById(id_product) 37 | if err != nil { 38 | return nil, err 39 | } 40 | 41 | return product, nil 42 | } 43 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module go-api 2 | 3 | go 1.18 4 | 5 | require ( 6 | github.com/gin-gonic/gin v1.9.1 7 | github.com/lib/pq v1.10.9 8 | ) 9 | 10 | require ( 11 | github.com/bytedance/sonic v1.9.1 // indirect 12 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect 13 | github.com/gabriel-vasile/mimetype v1.4.2 // indirect 14 | github.com/gin-contrib/sse v0.1.0 // indirect 15 | github.com/go-playground/locales v0.14.1 // indirect 16 | github.com/go-playground/universal-translator v0.18.1 // indirect 17 | github.com/go-playground/validator/v10 v10.14.0 // indirect 18 | github.com/goccy/go-json v0.10.2 // indirect 19 | github.com/json-iterator/go v1.1.12 // indirect 20 | github.com/klauspost/cpuid/v2 v2.2.4 // indirect 21 | github.com/leodido/go-urn v1.2.4 // indirect 22 | github.com/mattn/go-isatty v0.0.19 // indirect 23 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 24 | github.com/modern-go/reflect2 v1.0.2 // indirect 25 | github.com/pelletier/go-toml/v2 v2.0.8 // indirect 26 | github.com/twitchyliquid64/golang-asm v0.15.1 // indirect 27 | github.com/ugorji/go/codec v1.2.11 // indirect 28 | golang.org/x/arch v0.3.0 // indirect 29 | golang.org/x/crypto v0.9.0 // indirect 30 | golang.org/x/net v0.10.0 // indirect 31 | golang.org/x/sys v0.8.0 // indirect 32 | golang.org/x/text v0.9.0 // indirect 33 | google.golang.org/protobuf v1.30.0 // indirect 34 | gopkg.in/yaml.v3 v3.0.1 // indirect 35 | ) 36 | -------------------------------------------------------------------------------- /controller/product_controller.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "go-api/model" 5 | "go-api/usecase" 6 | "net/http" 7 | "strconv" 8 | 9 | "github.com/gin-gonic/gin" 10 | ) 11 | 12 | type productController struct { 13 | productUseCase usecase.ProductUsecase 14 | } 15 | 16 | func NewProductController(usecase usecase.ProductUsecase) productController { 17 | return productController{ 18 | productUseCase: usecase, 19 | } 20 | } 21 | 22 | func (p *productController) GetProducts(ctx *gin.Context) { 23 | 24 | products, err := p.productUseCase.GetProducts() 25 | if err != nil { 26 | ctx.JSON(http.StatusInternalServerError, err) 27 | return 28 | } 29 | 30 | ctx.JSON(http.StatusOK, products) 31 | } 32 | 33 | func (p *productController) CreateProduct(ctx *gin.Context) { 34 | 35 | var product model.Product 36 | err := ctx.BindJSON(&product) 37 | 38 | if err != nil { 39 | ctx.JSON(http.StatusBadRequest, err) 40 | return 41 | } 42 | 43 | insertedProduct, err := p.productUseCase.CreateProduct(product) 44 | if err != nil { 45 | ctx.JSON(http.StatusInternalServerError, err) 46 | return 47 | } 48 | 49 | ctx.JSON(http.StatusCreated, insertedProduct) 50 | } 51 | 52 | func (p *productController) GetProductById(ctx *gin.Context) { 53 | 54 | id := ctx.Param("productId") 55 | if id == "" { 56 | response := model.Response{ 57 | Message: "Id do produto nao pode ser nulo", 58 | } 59 | ctx.JSON(http.StatusBadRequest, response) 60 | return 61 | } 62 | 63 | productId, err := strconv.Atoi(id) 64 | if err != nil { 65 | response := model.Response{ 66 | Message: "Id do produto precisa ser um numero", 67 | } 68 | ctx.JSON(http.StatusBadRequest, response) 69 | return 70 | } 71 | 72 | product, err := p.productUseCase.GetProductById(productId) 73 | if err != nil { 74 | ctx.JSON(http.StatusInternalServerError, err) 75 | return 76 | } 77 | 78 | if product == nil { 79 | response := model.Response{ 80 | Message: "Produto nao foi encontrado na base de dados", 81 | } 82 | ctx.JSON(http.StatusNotFound, response) 83 | return 84 | } 85 | 86 | ctx.JSON(http.StatusOK, product) 87 | } 88 | -------------------------------------------------------------------------------- /repository/product_repository.go: -------------------------------------------------------------------------------- 1 | package repository 2 | 3 | import ( 4 | "database/sql" 5 | "fmt" 6 | "go-api/model" 7 | ) 8 | 9 | type ProductRepository struct { 10 | connection *sql.DB 11 | } 12 | 13 | func NewProductRepository(connection *sql.DB) ProductRepository { 14 | return ProductRepository{ 15 | connection: connection, 16 | } 17 | } 18 | 19 | func (pr *ProductRepository) GetProducts() ([]model.Product, error) { 20 | 21 | query := "SELECT id, product_name, price FROM product" 22 | rows, err := pr.connection.Query(query) 23 | if err != nil { 24 | fmt.Println(err) 25 | return []model.Product{}, err 26 | } 27 | 28 | var productList []model.Product 29 | var productObj model.Product 30 | 31 | for rows.Next() { 32 | err = rows.Scan( 33 | &productObj.ID, 34 | &productObj.Name, 35 | &productObj.Price) 36 | 37 | if err != nil { 38 | fmt.Println(err) 39 | return []model.Product{}, err 40 | } 41 | 42 | productList = append(productList, productObj) 43 | } 44 | 45 | rows.Close() 46 | 47 | return productList, nil 48 | } 49 | 50 | func (pr *ProductRepository) CreateProduct(product model.Product) (int, error) { 51 | 52 | var id int 53 | query, err := pr.connection.Prepare("INSERT INTO product" + 54 | "(product_name, price)" + 55 | " VALUES ($1, $2) RETURNING id") 56 | if err != nil { 57 | fmt.Println(err) 58 | return 0, err 59 | } 60 | 61 | err = query.QueryRow(product.Name, product.Price).Scan(&id) 62 | if err != nil { 63 | fmt.Println(err) 64 | return 0, err 65 | } 66 | 67 | query.Close() 68 | return id, nil 69 | } 70 | 71 | func (pr *ProductRepository) GetProductById(id_product int) (*model.Product, error) { 72 | 73 | query, err := pr.connection.Prepare("SELECT * FROM product WHERE id = $1") 74 | if err != nil { 75 | fmt.Println(err) 76 | return nil, err 77 | } 78 | 79 | var produto model.Product 80 | 81 | err = query.QueryRow(id_product).Scan( 82 | &produto.ID, 83 | &produto.Name, 84 | &produto.Price, 85 | ) 86 | 87 | if err != nil { 88 | if err == sql.ErrNoRows { 89 | return nil, nil 90 | } 91 | 92 | return nil, err 93 | } 94 | 95 | query.Close() 96 | return &produto, nil 97 | } 98 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= 2 | github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= 3 | github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= 4 | github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= 5 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= 6 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= 7 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 9 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 10 | github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= 11 | github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= 12 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 13 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 14 | github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= 15 | github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= 16 | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= 17 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 18 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= 19 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 20 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= 21 | github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= 22 | github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= 23 | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= 24 | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 25 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 26 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 27 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 28 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 29 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 30 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 31 | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 32 | github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= 33 | github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= 34 | github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= 35 | github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= 36 | github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= 37 | github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= 38 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 39 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 40 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 41 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 42 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 43 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= 44 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 45 | github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= 46 | github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= 47 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 48 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 49 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 50 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 51 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 52 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 53 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 54 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 55 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 56 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 57 | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 58 | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= 59 | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 60 | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= 61 | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 62 | github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= 63 | github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= 64 | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 65 | golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= 66 | golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 67 | golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= 68 | golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= 69 | golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= 70 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 71 | golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 72 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 73 | golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= 74 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 75 | golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= 76 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 77 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 78 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 79 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 80 | google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= 81 | google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 82 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 83 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 84 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 85 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 86 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 87 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 88 | --------------------------------------------------------------------------------