konfa-server/cmd/main.go
royalcat 4b60194897
All checks were successful
docker / build-docker (push) Successful in 3m29s
external login
2024-12-25 17:20:49 +03:00

113 lines
2.6 KiB
Go

package main
import (
"context"
"fmt"
"log"
"net"
"github.com/ilyakaznacheev/cleanenv"
"github.com/royalcat/konfa-server/pkg/uuid"
"github.com/royalcat/konfa-server/src/auth"
"github.com/royalcat/konfa-server/src/konfa"
"github.com/royalcat/konfa-server/src/proto"
chatv1 "github.com/royalcat/konfa-server/src/proto/konfa/chat/v1"
serverv1 "github.com/royalcat/konfa-server/src/proto/konfa/server/v1"
"github.com/royalcat/konfa-server/src/store"
"google.golang.org/grpc"
)
type Config struct {
DB string `env:"DB"`
}
func main() {
ctx := context.Background()
var cfg Config
err := cleanenv.ReadEnv(&cfg)
if err != nil {
panic(err)
}
db, dbpool, err := store.ConnectPostgres(ctx, cfg.DB)
if err != nil {
panic(err)
}
srv := konfa.NewService(db, dbpool)
authen, err := auth.NewAuthenticator(ctx, db, auth.AuthenticatorConfig{
Issuer: "https://sso.konfach.ru/realms/konfach",
ClientID: "konfa",
ClientSecret: "UqeaMowRXcGULkAepr0EAEUfE82OjY72",
})
if err != nil {
panic(err)
}
grpcServer := grpc.NewServer(
grpc.UnaryInterceptor(authen.UnaryAuthenticate),
grpc.StreamInterceptor(authen.StreamAuthenticate),
)
chatv1.RegisterChatServiceServer(grpcServer, proto.NewChatService(srv))
serverv1.RegisterServerServiceServer(grpcServer, proto.NewServerService(srv))
serverID, chanID, err := createKonfach(ctx, srv)
if err != nil {
panic(err)
}
println(serverID.String())
println(chanID.String())
port := 38100
lis, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
println("Server is running on port", port)
panic(grpcServer.Serve(lis))
}
func createKonfach(ctx context.Context, srv *konfa.Service) (uuid.UUID, uuid.UUID, error) {
var serverID uuid.UUID
servers, err := srv.ListServers(ctx)
if err != nil {
return uuid.Nil, uuid.Nil, fmt.Errorf("failed to list servers: %w", err)
}
for _, serv := range servers {
if serv.Name == "konfach" {
serverID = serv.ID
}
}
if serverID == uuid.Nil {
serverID, err = srv.CreateServer(ctx, "konfach")
if err != nil {
return uuid.Nil, uuid.Nil, fmt.Errorf("failed to create server: %w", err)
}
}
var chanID uuid.UUID
channels, err := srv.ListTextChannelsOnServer(ctx, serverID)
if err != nil {
return uuid.Nil, uuid.Nil, err
}
for _, channel := range channels {
if channel.Name == "general" {
chanID = channel.ID
}
}
if chanID == uuid.Nil {
chanID, err = srv.CreateTextChannel(ctx, serverID, "general")
if err != nil {
return uuid.Nil, uuid.Nil, fmt.Errorf("failed to create channel: %w", err)
}
}
return serverID, chanID, nil
}