Compare commits

..

8 Commits

Author SHA1 Message Date
VLADIMIR 4f69b56c99 Обновить internal/app/server.go 2026-06-20 09:23:05 +00:00
VLADIMIR 7768ec7c5f Обновить internal/app/server.go 2026-06-20 09:20:22 +00:00
VLADIMIR 0ad9d400e3 update server 2026-06-20 16:17:52 +07:00
VLADIMIR bec73c4836 add swagger docs 2026-06-20 15:53:39 +07:00
VLADIMIR b6e8b2576a Обновить .gitea/template 2026-06-18 15:36:52 +00:00
VLADIMIR 2b72392f90 fix 2026-06-18 22:34:52 +07:00
VLADIMIR 24077e1135 Merge branch 'master' of https://git.3crabs.ru/VLADIMIR/template 2026-06-18 22:34:04 +07:00
VLADIMIR 5d76478c09 fix 2026-06-18 20:05:09 +07:00
7 changed files with 54 additions and 14 deletions
+4 -4
View File
@@ -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"
} }
] ]
+1 -1
View File
@@ -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
View File
@@ -1,6 +1,7 @@
# template # template
Шалон для Go сервисов (имя репо должно быть snake case) Шалон для Go сервисов (имя репо должно быть snake case)
Методы http должны быть с префиксом /api
Инициализация Инициализация
+14 -1
View File
@@ -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;
}
+20 -1
View File
@@ -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())
} }
+4 -1
View File
@@ -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
View File
@@ -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
}