Files
evening_detective_server/cmd/evening_detective_server/main.go
T
2026-07-04 13:09:39 +07:00

113 lines
3.1 KiB
Go

package main
import (
"context"
_ "embed"
"evening_detective_server/internal/app"
"evening_detective_server/internal/modules/email_sender"
"evening_detective_server/internal/modules/password_generator"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/repos/users_repo"
"evening_detective_server/internal/services/users_service"
proto "evening_detective_server/proto"
"log"
"net"
"net/http"
"os"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/joho/godotenv"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"github.com/swaggest/swgui/v5emb"
)
//go:embed main.swagger.json
var swaggerJSON []byte
func main() {
_ = godotenv.Load()
// PostgreSQL
dbpool, err := pgxpool.New(context.Background(), os.Getenv("DATABASE_URL"))
if err != nil {
log.Fatalf("Unable to create connection pool: %v\n", err)
}
defer dbpool.Close()
// Test request to DB
var greeting string
if err = dbpool.QueryRow(context.Background(), "select 'Hello, world!'").Scan(&greeting); err != nil {
log.Fatalf("QueryRow failed: %v\n", err)
}
usersRepo := users_repo.NewUserRepo(dbpool)
passwordGenerator := password_generator.NewGenerator(8)
smtpHost := os.Getenv("SMTP_HOST")
smtpPort := os.Getenv("SMTP_PORT")
smtpUser := os.Getenv("SMTP_USER")
smtpPassword := os.Getenv("SMTP_PASSWORD")
emailSender := email_sender.NewSender(smtpHost, smtpPort, smtpUser, smtpPassword)
processorJWT := processor_jwt.NewProcessor(os.Getenv("SECRET"))
usersService := users_service.NewUsersService(usersRepo, passwordGenerator, emailSender, processorJWT)
// 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
proto.RegisterEveningDetectiveServerServer(
s,
app.NewServer(
usersService,
),
)
// 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()
// Register Greeter
err = proto.RegisterEveningDetectiveServerHandler(context.Background(), gwmux, conn)
if err != nil {
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{
Addr: ":8090",
Handler: mainMux,
}
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())
}