evening_detective/cmd/evening_detective/main.go

107 lines
2.6 KiB
Go

package main
import (
"context"
"evening_detective/internal/app"
"evening_detective/internal/services"
"evening_detective/internal/services/story_service"
proto "evening_detective/proto"
"log"
"net"
"net/http"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
)
func main() {
// Create a listener on TCP port
lis, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalln("Failed to listen:", err)
}
// Create a gRPC server object
s := grpc.NewServer()
// Attach the Greeter service to the server
repository, err := services.NewRepository()
if err != nil {
panic(err)
}
storyService, err := story_service.NewStoryService()
if err != nil {
panic(err)
}
proto.RegisterEveningDetectiveServer(
s,
app.NewServer(
services.NewServices(
repository,
storyService,
),
),
)
// Serve gRPC server
log.Println("Serving gRPC on 0.0.0.0:8080")
go func() {
log.Fatalln(s.Serve(lis))
}()
// Create a client connection to the gRPC server we just started
// This is where the gRPC-Gateway proxies the requests
conn, err := grpc.NewClient(
"0.0.0.0:8080",
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
log.Fatalln("Failed to dial server:", err)
}
gwmux := runtime.NewServeMux(
runtime.WithMetadata(func(ctx context.Context, request *http.Request) metadata.MD {
teamId := request.Header.Get("X-Id")
return metadata.Pairs("team-id", teamId)
}),
runtime.WithMetadata(func(ctx context.Context, request *http.Request) metadata.MD {
password := request.Header.Get("X-Password")
return metadata.Pairs("password", password)
}),
)
// Register Greeter
err = proto.RegisterEveningDetectiveHandler(context.Background(), gwmux, conn)
if err != nil {
log.Fatalln("Failed to register gateway:", err)
}
gwServer := &http.Server{
Addr: ":8090",
Handler: gwmux,
}
// Serve gRPC-Gateway server
log.Println("Serving gRPC-Gateway on http://0.0.0.0:8090")
go func() {
log.Fatalln(gwServer.ListenAndServe())
}()
muxUser := http.NewServeMux()
fileServerUser := http.FileServer(http.Dir("./static/user"))
muxUser.Handle("/", fileServerUser)
// Serve user web server
log.Println("Serving user web on http://0.0.0.0:8100")
go func() {
log.Fatalln(http.ListenAndServe(":8100", muxUser))
}()
muxAdmin := http.NewServeMux()
fileServerAdmin := http.FileServer(http.Dir("./static/admin"))
muxAdmin.Handle("/", fileServerAdmin)
// Serve admin web server
log.Println("Serving admin web on http://0.0.0.0:8110")
log.Fatalln(http.ListenAndServe(":8110", muxAdmin))
}