Compare commits
6 Commits
24077e1135
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f69b56c99 | |||
| 7768ec7c5f | |||
| 0ad9d400e3 | |||
| bec73c4836 | |||
| b6e8b2576a | |||
| 2b72392f90 |
@@ -13,3 +13,5 @@ docker-compose-db.yml
|
|||||||
Dockerfile
|
Dockerfile
|
||||||
.env.example
|
.env.example
|
||||||
README.md
|
README.md
|
||||||
|
|
||||||
|
.vscode/launch.json
|
||||||
|
|||||||
Vendored
+4
-4
@@ -9,11 +9,11 @@
|
|||||||
"type": "go",
|
"type": "go",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"mode": "debug",
|
"mode": "debug",
|
||||||
"program": "${workspaceFolder}/cmd/${REPO_NAME_SNAKE}",
|
"program": "${${workspaceFolder}}/cmd/${REPO_NAME_SNAKE}",
|
||||||
"args": [
|
"args": [
|
||||||
"--local"
|
"--local"
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${${workspaceFolder}}",
|
||||||
"buildFlags": "-tags local"
|
"buildFlags": "-tags local"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -21,11 +21,11 @@
|
|||||||
"type": "go",
|
"type": "go",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"mode": "debug",
|
"mode": "debug",
|
||||||
"program": "${workspaceFolder}/cmd/${REPO_NAME_SNAKE}",
|
"program": "${${workspaceFolder}}/cmd/${REPO_NAME_SNAKE}",
|
||||||
"args": [
|
"args": [
|
||||||
"--local"
|
"--local"
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${${workspaceFolder}}",
|
||||||
"buildFlags": "-tags local"
|
"buildFlags": "-tags local"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ generate:
|
|||||||
--go_out ./proto --go_opt paths=source_relative \
|
--go_out ./proto --go_opt paths=source_relative \
|
||||||
--go-grpc_out ./proto --go-grpc_opt paths=source_relative \
|
--go-grpc_out ./proto --go-grpc_opt paths=source_relative \
|
||||||
--grpc-gateway_out ./proto --grpc-gateway_opt paths=source_relative,generate_unbound_methods=true \
|
--grpc-gateway_out ./proto --grpc-gateway_opt paths=source_relative,generate_unbound_methods=true \
|
||||||
--openapiv2_out ./proto --openapiv2_opt allow_merge=true,merge_file_name=main \
|
--openapiv2_out=./cmd/${REPO_NAME_SNAKE} --openapiv2_opt allow_merge=true,merge_file_name=main \
|
||||||
./api/main.proto
|
./api/main.proto
|
||||||
|
|
||||||
run:
|
run:
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# template
|
# template
|
||||||
|
|
||||||
Шалон для Go сервисов (имя репо должно быть snake case)
|
Шалон для Go сервисов (имя репо должно быть snake case)
|
||||||
|
Методы http должны быть с префиксом /api
|
||||||
|
|
||||||
Инициализация
|
Инициализация
|
||||||
|
|
||||||
|
|||||||
+14
-1
@@ -9,7 +9,12 @@ option go_package = "pkg/proto";
|
|||||||
service ${REPO_NAME_PASCAL} {
|
service ${REPO_NAME_PASCAL} {
|
||||||
rpc Ping(PingReq) returns (PingRsp) {
|
rpc Ping(PingReq) returns (PingRsp) {
|
||||||
option (google.api.http) = {
|
option (google.api.http) = {
|
||||||
get: "/ping"
|
get: "/api/ping"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
rpc Echo(EchoReq) returns (EchoRsp) {
|
||||||
|
option (google.api.http) = {
|
||||||
|
post: "/api/echo"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,3 +22,11 @@ service ${REPO_NAME_PASCAL} {
|
|||||||
message PingReq {}
|
message PingReq {}
|
||||||
|
|
||||||
message PingRsp {}
|
message PingRsp {}
|
||||||
|
|
||||||
|
message EchoReq {
|
||||||
|
string text = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message EchoRsp {
|
||||||
|
string text = 1;
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
_ "embed"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -14,17 +15,24 @@ import (
|
|||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials/insecure"
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
|
|
||||||
|
"github.com/swaggest/swgui/v5emb"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//go:embed main.swagger.json
|
||||||
|
var swaggerJSON []byte
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
_ = godotenv.Load()
|
_ = godotenv.Load()
|
||||||
|
|
||||||
|
// PostgreSQL
|
||||||
dbpool, err := pgxpool.New(context.Background(), os.Getenv("DATABASE_URL"))
|
dbpool, err := pgxpool.New(context.Background(), os.Getenv("DATABASE_URL"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Unable to create connection pool: %v\n", err)
|
log.Fatalf("Unable to create connection pool: %v\n", err)
|
||||||
}
|
}
|
||||||
defer dbpool.Close()
|
defer dbpool.Close()
|
||||||
|
|
||||||
|
// Test request to DB
|
||||||
var greeting string
|
var greeting string
|
||||||
if err = dbpool.QueryRow(context.Background(), "select 'Hello, world!'").Scan(&greeting); err != nil {
|
if err = dbpool.QueryRow(context.Background(), "select 'Hello, world!'").Scan(&greeting); err != nil {
|
||||||
log.Fatalf("QueryRow failed: %v\n", err)
|
log.Fatalf("QueryRow failed: %v\n", err)
|
||||||
@@ -63,11 +71,22 @@ func main() {
|
|||||||
log.Fatalln("Failed to register gateway:", err)
|
log.Fatalln("Failed to register gateway:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mainMux := http.NewServeMux()
|
||||||
|
|
||||||
|
docsHandler := v5emb.New("API", "/swagger/doc.json", "/docs/")
|
||||||
|
mainMux.Handle("/docs/", docsHandler)
|
||||||
|
mainMux.HandleFunc("/swagger/doc.json", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.Write(swaggerJSON)
|
||||||
|
})
|
||||||
|
mainMux.Handle("/api/", gwmux)
|
||||||
|
|
||||||
gwServer := &http.Server{
|
gwServer := &http.Server{
|
||||||
Addr: ":8090",
|
Addr: ":8090",
|
||||||
Handler: gwmux,
|
Handler: mainMux,
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println("Serving gRPC-Gateway on http://0.0.0.0:8090")
|
log.Println("Serving gRPC-Gateway on http://0.0.0.0:8090")
|
||||||
|
log.Println("Serving docs on http://0.0.0.0:8090/docs")
|
||||||
log.Fatalln(gwServer.ListenAndServe())
|
log.Fatalln(gwServer.ListenAndServe())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,15 @@ require (
|
|||||||
google.golang.org/protobuf v1.34.1
|
google.golang.org/protobuf v1.34.1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
require github.com/vearutop/statigz v1.4.0 // indirect
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||||
github.com/jackc/pgx/v5 v5.10.0 // indirect
|
github.com/jackc/pgx/v5 v5.10.0
|
||||||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||||||
github.com/joho/godotenv v1.5.1
|
github.com/joho/godotenv v1.5.1
|
||||||
|
github.com/swaggest/swgui v1.8.8
|
||||||
golang.org/x/net v0.23.0 // indirect
|
golang.org/x/net v0.23.0 // indirect
|
||||||
golang.org/x/sync v0.17.0 // indirect
|
golang.org/x/sync v0.17.0 // indirect
|
||||||
golang.org/x/sys v0.18.0 // indirect
|
golang.org/x/sys v0.18.0 // indirect
|
||||||
|
|||||||
+10
-6
@@ -1,18 +1,22 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
proto "${REPO_NAME_SNAKE}/proto"
|
|
||||||
"context"
|
"context"
|
||||||
|
proto "${REPO_NAME_SNAKE}/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Server struct {
|
type server struct {
|
||||||
proto.Unimplemented${REPO_NAME_PASCAL}Server
|
proto.Unsafe${REPO_NAME_PASCAL}Server
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServer() *Server {
|
func NewServer() proto.${REPO_NAME_PASCAL}Server {
|
||||||
return &Server{}
|
return &server{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) Ping(_ context.Context, _ *proto.PingReq) (*proto.PingRsp, error) {
|
func (s *server) Ping(_ context.Context, _ *proto.PingReq) (*proto.PingRsp, error) {
|
||||||
return &proto.PingRsp{}, nil
|
return &proto.PingRsp{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *server) Echo(_ context.Context, req *proto.EchoReq) (*proto.EchoRsp, error) {
|
||||||
|
return &proto.EchoRsp{Text: req.Text}, nil
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user