feat:#36 added protobuf communication for modules

This commit is contained in:
Elmar Kresse
2024-06-17 00:59:33 +02:00
parent 8548a537ec
commit fad85f2884
18 changed files with 1286 additions and 59 deletions

View File

@@ -19,12 +19,14 @@ FROM golang:alpine AS build
WORKDIR /app
RUN apk add --no-cache --update go gcc g++
# Copy the source from the current directory to the Working Directory inside the container
COPY . ./
# download needed modules
RUN apk add --no-cache --update go gcc g++ && \
go mod download && \
CGO_ENABLED=1 GOOS=linux go build -o /htwkalender-data-manager
COPY go.mod go.sum ./
RUN go mod download
COPY data-manager/. ./data-manager
COPY common/. ./common
RUN CGO_ENABLED=1 GOOS=linux go build -o /htwkalender-data-manager data-manager/main.go
# production stage
FROM alpine:latest AS prod
@@ -44,7 +46,7 @@ COPY --chown=$USER:$USER --from=build /htwkalender-data-manager ./
# Expose port 8090 to the outside world
EXPOSE 8090
ENTRYPOINT ["./htwkalender-data-manager", "serve"]
ENTRYPOINT ["./main", "serve"]
FROM golang:1.21.6 AS dev
@@ -53,18 +55,18 @@ FROM golang:1.21.6 AS dev
WORKDIR /htwkalender-data-manager
# Copy go mod and sum files
# COPY ../go.mod ../go.sum ./
# RUN go mod download
COPY go.mod go.sum ./
RUN go mod download
# Copy the source from the current directory to the Working Directory inside the container
COPY *.go ./
COPY . .
COPY data-manager/. ./data-manager
COPY common/. ./common
# Build the Go app
RUN CGO_ENABLED=1 GOOS=linux go build -o /htwkalender-data-manager
RUN CGO_ENABLED=1 GOOS=linux go build -o /htwkalender-data-manager data-manager/main.go
# Expose port 8090 to the outside world
EXPOSE 8090
# Expose port 8091 to the outside world
EXPOSE 8091
# Entry point
ENTRYPOINT ["./htwkalender-data-manager", "serve"]
ENTRYPOINT ["./main", "serve"]

View File

@@ -21,6 +21,7 @@ import (
"github.com/pocketbase/pocketbase/plugins/migratecmd"
_ "htwkalender/data-manager/migrations"
"htwkalender/data-manager/service"
"htwkalender/data-manager/service/grpc"
"log/slog"
"os"
"strings"
@@ -32,6 +33,9 @@ func main() {
// loosely check if it was executed using "go run"
isGoRun := strings.HasPrefix(os.Args[0], os.TempDir())
//start grpc server
go grpc.StartGRPCServer(app)
migratecmd.MustRegister(app, app.RootCmd, migratecmd.Config{
// enable auto creation of migration files when making collection changes in the Admin UI
// (the isGoRun check is to enable it only during development)
@@ -43,4 +47,5 @@ func main() {
if err := app.Start(); err != nil {
slog.Error("Failed to start app: ", "error", err)
}
}

View File

@@ -0,0 +1,25 @@
package grpc
import (
pb "htwkalender/common/genproto/modules"
"htwkalender/data-manager/model"
)
func eventToProto(event *model.Event) *pb.Event {
return &pb.Event{
Uuid: event.UUID,
Day: event.Day,
Week: event.Week,
Start: event.Start.String(),
End: event.End.String(),
Name: event.Name,
EventType: event.EventType,
Compulsory: event.Compulsory,
Prof: event.Prof,
Rooms: event.Rooms,
Notes: event.Notes,
BookedAt: event.BookedAt,
Course: event.Course,
Semester: event.Semester,
}
}

View File

@@ -0,0 +1,69 @@
package grpc
import (
"context"
"github.com/pocketbase/pocketbase"
"htwkalender/data-manager/service/db"
"log"
"net"
"google.golang.org/grpc"
pb "htwkalender/common/genproto/modules"
)
type ModulesGrpcHandler struct {
app *pocketbase.PocketBase
pb.UnimplementedModuleServiceServer
}
func (s *ModulesGrpcHandler) GetModule(ctx context.Context, in *pb.GetModuleRequest) (*pb.GetModuleResponse, error) {
// get module from database by UUID
module, err := db.FindModuleByUUID(s.app, in.Uuid)
if err != nil {
return nil, err
}
events, err := db.FindAllEventsByModule(s.app, module)
if err != nil {
return nil, err
}
//map module Events to proto struct Events
protoEvents := make([]*pb.Event, 0)
for _, event := range events {
protoEvents = append(protoEvents, eventToProto(&event))
}
//map module to proto struct
protoModule := &pb.Module{
Uuid: module.UUID,
Name: module.Name,
Prof: module.Prof,
Course: module.Course,
Semester: module.Semester,
Events: protoEvents,
}
// Implement your logic here to fetch module data based on the UUID
// Example response
return &pb.GetModuleResponse{
Module: protoModule,
}, nil
}
func StartGRPCServer(app *pocketbase.PocketBase) {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterModuleServiceServer(s, &ModulesGrpcHandler{
app: app,
})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}