mirror of
https://github.com/hexolan/panels.git
synced 2026-03-26 12:40:21 +00:00
style: license headers + gofmt
This commit is contained in:
@@ -1,3 +1,17 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
@@ -6,17 +20,17 @@ import (
|
||||
"github.com/rs/zerolog"
|
||||
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
"github.com/hexolan/panels/post-service/internal/postgres"
|
||||
"github.com/hexolan/panels/post-service/internal/redis"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/producer"
|
||||
"github.com/hexolan/panels/post-service/internal/postgres"
|
||||
"github.com/hexolan/panels/post-service/internal/redis"
|
||||
"github.com/hexolan/panels/post-service/internal/rpc"
|
||||
"github.com/hexolan/panels/post-service/internal/service"
|
||||
)
|
||||
|
||||
func main() {
|
||||
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
|
||||
|
||||
|
||||
// Load the configuration
|
||||
cfg := internal.NewConfig()
|
||||
zerolog.SetGlobalLevel(cfg.GetLogLevel())
|
||||
@@ -39,4 +53,4 @@ func main() {
|
||||
// Create and serve RPC
|
||||
rpcServer := rpc.NewRPCServer(service)
|
||||
rpcServer.Serve()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,27 @@
|
||||
//go:build tools
|
||||
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
// Protobuf Generation
|
||||
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
|
||||
_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
|
||||
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
|
||||
|
||||
// DB Migrations
|
||||
_ "github.com/golang-migrate/migrate/v4"
|
||||
_ "github.com/golang-migrate/migrate/v4/database/postgres"
|
||||
)
|
||||
_ "github.com/golang-migrate/migrate/v4"
|
||||
_ "github.com/golang-migrate/migrate/v4/database/postgres"
|
||||
)
|
||||
|
||||
@@ -1,15 +1,29 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package internal
|
||||
|
||||
import (
|
||||
"os"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func NewConfig() Config {
|
||||
func NewConfig() Config {
|
||||
// Parse the log level
|
||||
logLvl, err := zerolog.ParseLevel(optFromEnvFallback("LOG_LEVEL", "info"))
|
||||
if err != nil {
|
||||
@@ -24,10 +38,10 @@ func NewConfig() Config {
|
||||
|
||||
// Create the config
|
||||
cfg := Config{
|
||||
RedisHost: optFromEnvRequire("REDIS_HOST"),
|
||||
RedisPass: optFromEnvRequire("REDIS_PASS"),
|
||||
RedisHost: optFromEnvRequire("REDIS_HOST"),
|
||||
RedisPass: optFromEnvRequire("REDIS_PASS"),
|
||||
KafkaBrokers: kafkaBrokers,
|
||||
LogLevel: logLvl,
|
||||
LogLevel: logLvl,
|
||||
}
|
||||
|
||||
// Assemble the Config.PostgresURL
|
||||
@@ -86,4 +100,4 @@ func (cfg Config) GetPostgresURL() string {
|
||||
|
||||
func (cfg Config) GetLogLevel() zerolog.Level {
|
||||
return cfg.LogLevel
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package internal
|
||||
|
||||
import (
|
||||
@@ -10,7 +24,7 @@ import (
|
||||
func NewServiceError(code ErrorCode, msg string) error {
|
||||
return &ServiceError{
|
||||
code: code,
|
||||
msg: msg,
|
||||
msg: msg,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,8 +34,8 @@ func NewServiceErrorf(code ErrorCode, msg string, args ...interface{}) error {
|
||||
|
||||
func WrapServiceError(original_err error, code ErrorCode, msg string) error {
|
||||
return &ServiceError{
|
||||
code: code,
|
||||
msg: msg,
|
||||
code: code,
|
||||
msg: msg,
|
||||
original_err: original_err,
|
||||
}
|
||||
}
|
||||
@@ -39,12 +53,12 @@ const (
|
||||
|
||||
func (c ErrorCode) GRPCCode() codes.Code {
|
||||
codeMap := map[ErrorCode]codes.Code{
|
||||
UnknownErrorCode: codes.Unknown,
|
||||
NotFoundErrorCode: codes.NotFound,
|
||||
ConflictErrorCode: codes.AlreadyExists,
|
||||
ForbiddenErrorCode: codes.PermissionDenied,
|
||||
UnknownErrorCode: codes.Unknown,
|
||||
NotFoundErrorCode: codes.NotFound,
|
||||
ConflictErrorCode: codes.AlreadyExists,
|
||||
ForbiddenErrorCode: codes.PermissionDenied,
|
||||
InvalidArgumentErrorCode: codes.InvalidArgument,
|
||||
ConnectionErrorCode: codes.Unavailable,
|
||||
ConnectionErrorCode: codes.Unavailable,
|
||||
}
|
||||
|
||||
grpcCode, mapped := codeMap[c]
|
||||
@@ -55,8 +69,8 @@ func (c ErrorCode) GRPCCode() codes.Code {
|
||||
}
|
||||
|
||||
type ServiceError struct {
|
||||
code ErrorCode
|
||||
msg string
|
||||
code ErrorCode
|
||||
msg string
|
||||
original_err error
|
||||
}
|
||||
|
||||
@@ -77,4 +91,4 @@ func (e ServiceError) GRPCStatus() *status.Status {
|
||||
|
||||
func (e ServiceError) Unwrap() error {
|
||||
return e.original_err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package consumers
|
||||
|
||||
import (
|
||||
@@ -8,14 +22,14 @@ import (
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/producer"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/consumers/panelv1"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/producer"
|
||||
)
|
||||
|
||||
type PanelEventConsumer struct {
|
||||
reader *kafka.Reader
|
||||
|
||||
dbRepo internal.PostDBRepository
|
||||
dbRepo internal.PostDBRepository
|
||||
eventProd producer.PostEventProducer
|
||||
}
|
||||
|
||||
@@ -24,9 +38,9 @@ func NewPanelEventConsumer(cfg internal.Config, dbRepo internal.PostDBRepository
|
||||
reader: kafka.NewReader(kafka.ReaderConfig{
|
||||
Brokers: cfg.KafkaBrokers,
|
||||
GroupID: "post-service",
|
||||
Topic: "panel",
|
||||
Topic: "panel",
|
||||
}),
|
||||
dbRepo: dbRepo,
|
||||
dbRepo: dbRepo,
|
||||
eventProd: eventProd,
|
||||
}
|
||||
}
|
||||
@@ -42,7 +56,7 @@ func (ec PanelEventConsumer) ProcessEvent(evt *panelv1.PanelEvent) {
|
||||
if err == nil {
|
||||
for _, postId := range postIds {
|
||||
ec.eventProd.DispatchDeletedEvent(postId)
|
||||
}
|
||||
}
|
||||
}
|
||||
log.Debug().Str("src", "panel-event-consumer").Any("event", evt).Msg("processed panel deleted event")
|
||||
}
|
||||
@@ -73,4 +87,4 @@ func (ec PanelEventConsumer) Start() {
|
||||
if err := ec.reader.Close(); err != nil {
|
||||
log.Panic().Err(err).Str("src", "panel-event-consumer").Msg("failed to close Kafka reader")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.28.1
|
||||
// protoc-gen-go v1.31.0
|
||||
// protoc v4.23.4
|
||||
// source: panel.proto
|
||||
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
||||
// versions:
|
||||
// - protoc-gen-go-grpc v1.2.0
|
||||
// - protoc-gen-go-grpc v1.3.0
|
||||
// - protoc v4.23.4
|
||||
// source: panel.proto
|
||||
|
||||
@@ -19,6 +33,16 @@ import (
|
||||
// Requires gRPC-Go v1.32.0 or later.
|
||||
const _ = grpc.SupportPackageIsVersion7
|
||||
|
||||
const (
|
||||
PanelService_CreatePanel_FullMethodName = "/panels.panel.v1.PanelService/CreatePanel"
|
||||
PanelService_GetPanel_FullMethodName = "/panels.panel.v1.PanelService/GetPanel"
|
||||
PanelService_GetPanelByName_FullMethodName = "/panels.panel.v1.PanelService/GetPanelByName"
|
||||
PanelService_UpdatePanel_FullMethodName = "/panels.panel.v1.PanelService/UpdatePanel"
|
||||
PanelService_UpdatePanelByName_FullMethodName = "/panels.panel.v1.PanelService/UpdatePanelByName"
|
||||
PanelService_DeletePanel_FullMethodName = "/panels.panel.v1.PanelService/DeletePanel"
|
||||
PanelService_DeletePanelByName_FullMethodName = "/panels.panel.v1.PanelService/DeletePanelByName"
|
||||
)
|
||||
|
||||
// PanelServiceClient is the client API for PanelService service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
||||
@@ -42,7 +66,7 @@ func NewPanelServiceClient(cc grpc.ClientConnInterface) PanelServiceClient {
|
||||
|
||||
func (c *panelServiceClient) CreatePanel(ctx context.Context, in *CreatePanelRequest, opts ...grpc.CallOption) (*Panel, error) {
|
||||
out := new(Panel)
|
||||
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/CreatePanel", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PanelService_CreatePanel_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -51,7 +75,7 @@ func (c *panelServiceClient) CreatePanel(ctx context.Context, in *CreatePanelReq
|
||||
|
||||
func (c *panelServiceClient) GetPanel(ctx context.Context, in *GetPanelByIdRequest, opts ...grpc.CallOption) (*Panel, error) {
|
||||
out := new(Panel)
|
||||
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/GetPanel", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PanelService_GetPanel_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -60,7 +84,7 @@ func (c *panelServiceClient) GetPanel(ctx context.Context, in *GetPanelByIdReque
|
||||
|
||||
func (c *panelServiceClient) GetPanelByName(ctx context.Context, in *GetPanelByNameRequest, opts ...grpc.CallOption) (*Panel, error) {
|
||||
out := new(Panel)
|
||||
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/GetPanelByName", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PanelService_GetPanelByName_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -69,7 +93,7 @@ func (c *panelServiceClient) GetPanelByName(ctx context.Context, in *GetPanelByN
|
||||
|
||||
func (c *panelServiceClient) UpdatePanel(ctx context.Context, in *UpdatePanelByIdRequest, opts ...grpc.CallOption) (*Panel, error) {
|
||||
out := new(Panel)
|
||||
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/UpdatePanel", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PanelService_UpdatePanel_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -78,7 +102,7 @@ func (c *panelServiceClient) UpdatePanel(ctx context.Context, in *UpdatePanelByI
|
||||
|
||||
func (c *panelServiceClient) UpdatePanelByName(ctx context.Context, in *UpdatePanelByNameRequest, opts ...grpc.CallOption) (*Panel, error) {
|
||||
out := new(Panel)
|
||||
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/UpdatePanelByName", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PanelService_UpdatePanelByName_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -87,7 +111,7 @@ func (c *panelServiceClient) UpdatePanelByName(ctx context.Context, in *UpdatePa
|
||||
|
||||
func (c *panelServiceClient) DeletePanel(ctx context.Context, in *DeletePanelByIdRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/DeletePanel", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PanelService_DeletePanel_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -96,7 +120,7 @@ func (c *panelServiceClient) DeletePanel(ctx context.Context, in *DeletePanelByI
|
||||
|
||||
func (c *panelServiceClient) DeletePanelByName(ctx context.Context, in *DeletePanelByNameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/DeletePanelByName", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PanelService_DeletePanelByName_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -165,7 +189,7 @@ func _PanelService_CreatePanel_Handler(srv interface{}, ctx context.Context, dec
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.panel.v1.PanelService/CreatePanel",
|
||||
FullMethod: PanelService_CreatePanel_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PanelServiceServer).CreatePanel(ctx, req.(*CreatePanelRequest))
|
||||
@@ -183,7 +207,7 @@ func _PanelService_GetPanel_Handler(srv interface{}, ctx context.Context, dec fu
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.panel.v1.PanelService/GetPanel",
|
||||
FullMethod: PanelService_GetPanel_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PanelServiceServer).GetPanel(ctx, req.(*GetPanelByIdRequest))
|
||||
@@ -201,7 +225,7 @@ func _PanelService_GetPanelByName_Handler(srv interface{}, ctx context.Context,
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.panel.v1.PanelService/GetPanelByName",
|
||||
FullMethod: PanelService_GetPanelByName_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PanelServiceServer).GetPanelByName(ctx, req.(*GetPanelByNameRequest))
|
||||
@@ -219,7 +243,7 @@ func _PanelService_UpdatePanel_Handler(srv interface{}, ctx context.Context, dec
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.panel.v1.PanelService/UpdatePanel",
|
||||
FullMethod: PanelService_UpdatePanel_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PanelServiceServer).UpdatePanel(ctx, req.(*UpdatePanelByIdRequest))
|
||||
@@ -237,7 +261,7 @@ func _PanelService_UpdatePanelByName_Handler(srv interface{}, ctx context.Contex
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.panel.v1.PanelService/UpdatePanelByName",
|
||||
FullMethod: PanelService_UpdatePanelByName_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PanelServiceServer).UpdatePanelByName(ctx, req.(*UpdatePanelByNameRequest))
|
||||
@@ -255,7 +279,7 @@ func _PanelService_DeletePanel_Handler(srv interface{}, ctx context.Context, dec
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.panel.v1.PanelService/DeletePanel",
|
||||
FullMethod: PanelService_DeletePanel_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PanelServiceServer).DeletePanel(ctx, req.(*DeletePanelByIdRequest))
|
||||
@@ -273,7 +297,7 @@ func _PanelService_DeletePanelByName_Handler(srv interface{}, ctx context.Contex
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.panel.v1.PanelService/DeletePanelByName",
|
||||
FullMethod: PanelService_DeletePanelByName_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PanelServiceServer).DeletePanelByName(ctx, req.(*DeletePanelByNameRequest))
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package consumers
|
||||
|
||||
import (
|
||||
@@ -8,14 +22,14 @@ import (
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/producer"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/consumers/userv1"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/producer"
|
||||
)
|
||||
|
||||
type UserEventConsumer struct {
|
||||
reader *kafka.Reader
|
||||
|
||||
dbRepo internal.PostDBRepository
|
||||
dbRepo internal.PostDBRepository
|
||||
eventProd producer.PostEventProducer
|
||||
}
|
||||
|
||||
@@ -24,7 +38,7 @@ func NewUserEventConsumer(cfg internal.Config, dbRepo internal.PostDBRepository,
|
||||
reader: kafka.NewReader(kafka.ReaderConfig{
|
||||
Brokers: cfg.KafkaBrokers,
|
||||
GroupID: "post-service",
|
||||
Topic: "user",
|
||||
Topic: "user",
|
||||
}),
|
||||
dbRepo: dbRepo,
|
||||
}
|
||||
@@ -72,4 +86,4 @@ func (ec UserEventConsumer) Start() {
|
||||
if err := ec.reader.Close(); err != nil {
|
||||
log.Panic().Err(err).Str("src", "user-event-consumer").Msg("failed to close Kafka reader")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.28.1
|
||||
// protoc-gen-go v1.31.0
|
||||
// protoc v4.23.4
|
||||
// source: user.proto
|
||||
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
||||
// versions:
|
||||
// - protoc-gen-go-grpc v1.2.0
|
||||
// - protoc-gen-go-grpc v1.3.0
|
||||
// - protoc v4.23.4
|
||||
// source: user.proto
|
||||
|
||||
@@ -19,6 +33,16 @@ import (
|
||||
// Requires gRPC-Go v1.32.0 or later.
|
||||
const _ = grpc.SupportPackageIsVersion7
|
||||
|
||||
const (
|
||||
UserService_CreateUser_FullMethodName = "/panels.user.v1.UserService/CreateUser"
|
||||
UserService_GetUser_FullMethodName = "/panels.user.v1.UserService/GetUser"
|
||||
UserService_GetUserByName_FullMethodName = "/panels.user.v1.UserService/GetUserByName"
|
||||
UserService_UpdateUser_FullMethodName = "/panels.user.v1.UserService/UpdateUser"
|
||||
UserService_UpdateUserByName_FullMethodName = "/panels.user.v1.UserService/UpdateUserByName"
|
||||
UserService_DeleteUser_FullMethodName = "/panels.user.v1.UserService/DeleteUser"
|
||||
UserService_DeleteUserByName_FullMethodName = "/panels.user.v1.UserService/DeleteUserByName"
|
||||
)
|
||||
|
||||
// UserServiceClient is the client API for UserService service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
||||
@@ -42,7 +66,7 @@ func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {
|
||||
|
||||
func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*User, error) {
|
||||
out := new(User)
|
||||
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/CreateUser", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, UserService_CreateUser_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -51,7 +75,7 @@ func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserReques
|
||||
|
||||
func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserByIdRequest, opts ...grpc.CallOption) (*User, error) {
|
||||
out := new(User)
|
||||
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/GetUser", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -60,7 +84,7 @@ func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserByIdRequest,
|
||||
|
||||
func (c *userServiceClient) GetUserByName(ctx context.Context, in *GetUserByNameRequest, opts ...grpc.CallOption) (*User, error) {
|
||||
out := new(User)
|
||||
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/GetUserByName", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, UserService_GetUserByName_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -69,7 +93,7 @@ func (c *userServiceClient) GetUserByName(ctx context.Context, in *GetUserByName
|
||||
|
||||
func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserByIdRequest, opts ...grpc.CallOption) (*User, error) {
|
||||
out := new(User)
|
||||
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/UpdateUser", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, UserService_UpdateUser_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -78,7 +102,7 @@ func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserByIdRe
|
||||
|
||||
func (c *userServiceClient) UpdateUserByName(ctx context.Context, in *UpdateUserByNameRequest, opts ...grpc.CallOption) (*User, error) {
|
||||
out := new(User)
|
||||
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/UpdateUserByName", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, UserService_UpdateUserByName_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -87,7 +111,7 @@ func (c *userServiceClient) UpdateUserByName(ctx context.Context, in *UpdateUser
|
||||
|
||||
func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserByIdRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/DeleteUser", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, UserService_DeleteUser_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -96,7 +120,7 @@ func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserByIdRe
|
||||
|
||||
func (c *userServiceClient) DeleteUserByName(ctx context.Context, in *DeleteUserByNameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/DeleteUserByName", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, UserService_DeleteUserByName_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -165,7 +189,7 @@ func _UserService_CreateUser_Handler(srv interface{}, ctx context.Context, dec f
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.user.v1.UserService/CreateUser",
|
||||
FullMethod: UserService_CreateUser_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(UserServiceServer).CreateUser(ctx, req.(*CreateUserRequest))
|
||||
@@ -183,7 +207,7 @@ func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.user.v1.UserService/GetUser",
|
||||
FullMethod: UserService_GetUser_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(UserServiceServer).GetUser(ctx, req.(*GetUserByIdRequest))
|
||||
@@ -201,7 +225,7 @@ func _UserService_GetUserByName_Handler(srv interface{}, ctx context.Context, de
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.user.v1.UserService/GetUserByName",
|
||||
FullMethod: UserService_GetUserByName_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(UserServiceServer).GetUserByName(ctx, req.(*GetUserByNameRequest))
|
||||
@@ -219,7 +243,7 @@ func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec f
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.user.v1.UserService/UpdateUser",
|
||||
FullMethod: UserService_UpdateUser_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(UserServiceServer).UpdateUser(ctx, req.(*UpdateUserByIdRequest))
|
||||
@@ -237,7 +261,7 @@ func _UserService_UpdateUserByName_Handler(srv interface{}, ctx context.Context,
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.user.v1.UserService/UpdateUserByName",
|
||||
FullMethod: UserService_UpdateUserByName_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(UserServiceServer).UpdateUserByName(ctx, req.(*UpdateUserByNameRequest))
|
||||
@@ -255,7 +279,7 @@ func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec f
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.user.v1.UserService/DeleteUser",
|
||||
FullMethod: UserService_DeleteUser_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(UserServiceServer).DeleteUser(ctx, req.(*DeleteUserByIdRequest))
|
||||
@@ -273,7 +297,7 @@ func _UserService_DeleteUserByName_Handler(srv interface{}, ctx context.Context,
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.user.v1.UserService/DeleteUserByName",
|
||||
FullMethod: UserService_DeleteUserByName_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(UserServiceServer).DeleteUserByName(ctx, req.(*DeleteUserByNameRequest))
|
||||
|
||||
@@ -1,23 +1,37 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package kafka
|
||||
|
||||
import (
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/producer"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/consumers"
|
||||
"github.com/hexolan/panels/post-service/internal/kafka/producer"
|
||||
)
|
||||
|
||||
type eventConsumers struct {
|
||||
userEC consumers.UserEventConsumer
|
||||
userEC consumers.UserEventConsumer
|
||||
panelEC consumers.PanelEventConsumer
|
||||
}
|
||||
|
||||
func NewEventConsumers(cfg internal.Config, dbRepo internal.PostDBRepository, eventProd producer.PostEventProducer) eventConsumers {
|
||||
return eventConsumers{
|
||||
userEC: consumers.NewUserEventConsumer(cfg, dbRepo, eventProd),
|
||||
userEC: consumers.NewUserEventConsumer(cfg, dbRepo, eventProd),
|
||||
panelEC: consumers.NewPanelEventConsumer(cfg, dbRepo, eventProd),
|
||||
}
|
||||
}
|
||||
|
||||
func (ecs eventConsumers) Start() {
|
||||
go ecs.panelEC.Start()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package producer
|
||||
|
||||
import (
|
||||
@@ -17,8 +31,8 @@ type PostEventProducer struct {
|
||||
|
||||
func NewPostEventProducer(cfg internal.Config) PostEventProducer {
|
||||
writer := &kafka.Writer{
|
||||
Addr: kafka.TCP(cfg.KafkaBrokers...),
|
||||
Topic: "post",
|
||||
Addr: kafka.TCP(cfg.KafkaBrokers...),
|
||||
Topic: "post",
|
||||
Balancer: &kafka.LeastBytes{},
|
||||
}
|
||||
|
||||
@@ -57,4 +71,4 @@ func (ep PostEventProducer) DispatchDeletedEvent(id internal.PostId) {
|
||||
Type: "deleted",
|
||||
Data: &postv1.Post{Id: id.GetReprId()},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,47 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package internal
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"context"
|
||||
"strconv"
|
||||
"encoding/json"
|
||||
"database/sql"
|
||||
"database/sql/driver"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
"encoding/json"
|
||||
"regexp"
|
||||
"strconv"
|
||||
|
||||
"github.com/go-ozzo/ozzo-validation/v4"
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
)
|
||||
|
||||
// Post Models
|
||||
type Post struct {
|
||||
Id PostId `json:"id"`
|
||||
|
||||
PanelId string `json:"panel_id"`
|
||||
PanelId string `json:"panel_id"`
|
||||
AuthorId string `json:"author_id"`
|
||||
|
||||
Title string `json:"title"`
|
||||
Title string `json:"title"`
|
||||
Content string `json:"content"`
|
||||
|
||||
|
||||
CreatedAt pgtype.Timestamp `json:"created_at"`
|
||||
UpdatedAt pgtype.Timestamp `json:"updated_at"`
|
||||
}
|
||||
|
||||
type PostCreate struct {
|
||||
Title string `json:"title"`
|
||||
Title string `json:"title"`
|
||||
Content string `json:"content"`
|
||||
}
|
||||
|
||||
@@ -40,7 +54,7 @@ func (p *PostCreate) Validate() error {
|
||||
}
|
||||
|
||||
type PostUpdate struct {
|
||||
Title *string `json:"title,omitempty"`
|
||||
Title *string `json:"title,omitempty"`
|
||||
Content *string `json:"content,omitempty"`
|
||||
}
|
||||
|
||||
@@ -58,15 +72,15 @@ type PostService interface {
|
||||
}
|
||||
|
||||
type PostRepository interface {
|
||||
CreatePost(ctx context.Context, panelId string, authorId string, data PostCreate) (*Post, error)
|
||||
GetPost(ctx context.Context, id PostId) (*Post, error)
|
||||
GetPanelPost(ctx context.Context, id PostId, panelId string) (*Post, error)
|
||||
UpdatePost(ctx context.Context, id PostId, data PostUpdate) (*Post, error)
|
||||
DeletePost(ctx context.Context, id PostId) error
|
||||
CreatePost(ctx context.Context, panelId string, authorId string, data PostCreate) (*Post, error)
|
||||
GetPost(ctx context.Context, id PostId) (*Post, error)
|
||||
GetPanelPost(ctx context.Context, id PostId, panelId string) (*Post, error)
|
||||
UpdatePost(ctx context.Context, id PostId, data PostUpdate) (*Post, error)
|
||||
DeletePost(ctx context.Context, id PostId) error
|
||||
|
||||
GetFeedPosts(ctx context.Context) ([]*Post, error)
|
||||
GetUserPosts(ctx context.Context, userId string) ([]*Post, error)
|
||||
GetPanelPosts(ctx context.Context, panelId string) ([]*Post, error)
|
||||
GetFeedPosts(ctx context.Context) ([]*Post, error)
|
||||
GetUserPosts(ctx context.Context, userId string) ([]*Post, error)
|
||||
GetPanelPosts(ctx context.Context, panelId string) ([]*Post, error)
|
||||
}
|
||||
|
||||
type PostDBRepository interface {
|
||||
@@ -159,4 +173,4 @@ func NewPostIdFromRepr(reprId string) (*PostId, error) {
|
||||
func getIdFromRepr(reprId string) (*int64, error) {
|
||||
id, err := strconv.ParseInt(reprId, 36, 64)
|
||||
return &id, err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,29 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"encoding/json"
|
||||
"strings"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/doug-martin/goqu/v9"
|
||||
_ "github.com/doug-martin/goqu/v9/dialect/postgres"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
)
|
||||
@@ -42,7 +56,7 @@ func (r postDatabaseRepo) GetPost(ctx context.Context, id internal.PostId) (*int
|
||||
var post internal.Post
|
||||
row := r.db.QueryRow(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts WHERE id=$1", id)
|
||||
err := row.Scan(&post.Id, &post.PanelId, &post.AuthorId, &post.Title, &post.Content, &post.CreatedAt, &post.UpdatedAt)
|
||||
if err != nil {
|
||||
if err != nil {
|
||||
if err == pgx.ErrNoRows {
|
||||
return nil, internal.WrapServiceError(err, internal.NotFoundErrorCode, "post not found")
|
||||
} else if strings.Contains(err.Error(), "failed to connect to") {
|
||||
@@ -59,7 +73,7 @@ func (r postDatabaseRepo) GetPanelPost(ctx context.Context, id internal.PostId,
|
||||
var post internal.Post
|
||||
row := r.db.QueryRow(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts WHERE id=$1 AND panel_id=$2", id, panelId)
|
||||
err := row.Scan(&post.Id, &post.PanelId, &post.AuthorId, &post.Title, &post.Content, &post.CreatedAt, &post.UpdatedAt)
|
||||
if err != nil {
|
||||
if err != nil {
|
||||
if err == pgx.ErrNoRows {
|
||||
return nil, internal.WrapServiceError(err, internal.NotFoundErrorCode, "post not found on that panel")
|
||||
} else if strings.Contains(err.Error(), "failed to connect to") {
|
||||
@@ -77,7 +91,7 @@ func (r postDatabaseRepo) UpdatePost(ctx context.Context, id internal.PostId, da
|
||||
patchData := goqu.Record{"updated_at": goqu.L("timezone('utc', now())")}
|
||||
marshalled, _ := json.Marshal(data)
|
||||
_ = json.Unmarshal(marshalled, &patchData)
|
||||
|
||||
|
||||
// Build a statement to updated the post
|
||||
statement, args, _ := goqu.Dialect("postgres").Update("posts").Prepared(true).Set(patchData).Where(goqu.C("id").Eq(id)).ToSQL()
|
||||
|
||||
@@ -123,7 +137,7 @@ func (r postDatabaseRepo) DeletePost(ctx context.Context, id internal.PostId) er
|
||||
func (r postDatabaseRepo) GetFeedPosts(ctx context.Context) ([]*internal.Post, error) {
|
||||
// todo: pagination
|
||||
rows, err := r.db.Query(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts ORDER BY created_at DESC LIMIT 25")
|
||||
if err != nil {
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "failed to connect to") {
|
||||
return nil, internal.WrapServiceError(err, internal.ConnectionErrorCode, "failed to connect to database")
|
||||
}
|
||||
@@ -152,7 +166,7 @@ func (r postDatabaseRepo) GetFeedPosts(ctx context.Context) ([]*internal.Post, e
|
||||
func (r postDatabaseRepo) GetUserPosts(ctx context.Context, userId string) ([]*internal.Post, error) {
|
||||
// todo: pagination
|
||||
rows, err := r.db.Query(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts WHERE author_id=$1 ORDER BY created_at DESC LIMIT 25", userId)
|
||||
if err != nil {
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "failed to connect to") {
|
||||
return nil, internal.WrapServiceError(err, internal.ConnectionErrorCode, "failed to connect to database")
|
||||
}
|
||||
@@ -181,7 +195,7 @@ func (r postDatabaseRepo) GetUserPosts(ctx context.Context, userId string) ([]*i
|
||||
func (r postDatabaseRepo) GetPanelPosts(ctx context.Context, panelId string) ([]*internal.Post, error) {
|
||||
// todo: pagination
|
||||
rows, err := r.db.Query(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts WHERE panel_id=$1 ORDER BY created_at DESC LIMIT 25", panelId)
|
||||
if err != nil {
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "failed to connect to") {
|
||||
return nil, internal.WrapServiceError(err, internal.ConnectionErrorCode, "failed to connect to database")
|
||||
}
|
||||
@@ -259,4 +273,4 @@ func (r postDatabaseRepo) DeletePostsOnPanel(ctx context.Context, panelId string
|
||||
}
|
||||
|
||||
return deletedIds, nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,24 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
)
|
||||
@@ -14,11 +28,11 @@ func NewPostgresInterface(ctx context.Context, cfg internal.Config) *pgxpool.Poo
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("")
|
||||
}
|
||||
|
||||
|
||||
err = db.Ping(ctx)
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Msg("failed Postgres ping")
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,26 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package redis
|
||||
|
||||
import (
|
||||
"time"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
)
|
||||
@@ -19,7 +33,7 @@ type postCacheRepo struct {
|
||||
|
||||
func NewPostRepository(rdb *redis.Client, repo internal.PostRepository) internal.PostRepository {
|
||||
return postCacheRepo{
|
||||
rdb: rdb,
|
||||
rdb: rdb,
|
||||
repo: repo,
|
||||
}
|
||||
}
|
||||
@@ -50,7 +64,7 @@ func (r postCacheRepo) cachePost(ctx context.Context, post *internal.Post) {
|
||||
return
|
||||
}
|
||||
|
||||
err = r.rdb.Set(ctx, post.Id.GetReprId(), string(value), 2 * time.Minute).Err()
|
||||
err = r.rdb.Set(ctx, post.Id.GetReprId(), string(value), 2*time.Minute).Err()
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("failed to cache post")
|
||||
return
|
||||
@@ -148,4 +162,4 @@ func (r postCacheRepo) GetUserPosts(ctx context.Context, userId string) ([]*inte
|
||||
|
||||
func (r postCacheRepo) GetPanelPosts(ctx context.Context, panelId string) ([]*internal.Post, error) {
|
||||
return r.repo.GetPanelPosts(ctx, panelId)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,38 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package redis
|
||||
|
||||
import (
|
||||
"time"
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
)
|
||||
|
||||
func NewRedisInterface(ctx context.Context, cfg internal.Config) *redis.Client {
|
||||
rdb := redis.NewClient(&redis.Options{
|
||||
Addr: cfg.RedisHost,
|
||||
Password: cfg.RedisPass,
|
||||
DB: 0,
|
||||
rdb := redis.NewClient(&redis.Options{
|
||||
Addr: cfg.RedisHost,
|
||||
Password: cfg.RedisPass,
|
||||
DB: 0,
|
||||
|
||||
DialTimeout: time.Millisecond * 250,
|
||||
ReadTimeout: time.Millisecond * 500,
|
||||
})
|
||||
})
|
||||
|
||||
_, err := rdb.Ping(ctx).Result()
|
||||
if err != nil {
|
||||
@@ -26,4 +40,4 @@ func NewRedisInterface(ctx context.Context, cfg internal.Config) *redis.Client {
|
||||
}
|
||||
|
||||
return rdb
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package rpc
|
||||
|
||||
import (
|
||||
@@ -13,7 +27,7 @@ import (
|
||||
|
||||
type postServer struct {
|
||||
pb.UnimplementedPostServiceServer
|
||||
|
||||
|
||||
service internal.PostService
|
||||
}
|
||||
|
||||
@@ -37,7 +51,7 @@ func (svr *postServer) CreatePost(ctx context.Context, request *pb.CreatePostReq
|
||||
|
||||
// Convert to service model
|
||||
data := pb.PostCreateFromProto(request.GetData())
|
||||
|
||||
|
||||
// Pass to service method for creation
|
||||
post, err := svr.service.CreatePost(ctx, request.GetPanelId(), request.GetUserId(), data)
|
||||
if err != nil {
|
||||
@@ -176,4 +190,4 @@ func (svr *postServer) GetPanelPosts(ctx context.Context, request *pb.GetPanelPo
|
||||
}
|
||||
|
||||
return &pb.PanelPosts{Posts: pb.PostsToProto(posts)}, nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,10 +12,10 @@ func PostToProto(post *internal.Post) *Post {
|
||||
proto := Post{
|
||||
Id: post.Id.GetReprId(),
|
||||
|
||||
PanelId: post.PanelId,
|
||||
PanelId: post.PanelId,
|
||||
AuthorId: post.AuthorId,
|
||||
|
||||
Title: post.Title,
|
||||
Title: post.Title,
|
||||
Content: post.Content,
|
||||
|
||||
CreatedAt: timestamppb.New(post.CreatedAt.Time),
|
||||
@@ -36,12 +36,12 @@ func PostsToProto(posts []*internal.Post) []*Post {
|
||||
protoPosts = append(protoPosts, PostToProto(post))
|
||||
}
|
||||
return protoPosts
|
||||
}
|
||||
}
|
||||
|
||||
// Protobuf 'PostMutable' -> PostCreate
|
||||
func PostCreateFromProto(proto *PostMutable) internal.PostCreate {
|
||||
return internal.PostCreate{
|
||||
Title: proto.GetTitle(),
|
||||
Title: proto.GetTitle(),
|
||||
Content: proto.GetContent(),
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,7 @@ func PostCreateFromProto(proto *PostMutable) internal.PostCreate {
|
||||
// Protobuf 'PostMutable' -> PostUpdate
|
||||
func PostUpdateFromProto(proto *PostMutable) internal.PostUpdate {
|
||||
return internal.PostUpdate{
|
||||
Title: proto.Title,
|
||||
Title: proto.Title,
|
||||
Content: proto.Content,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.28.1
|
||||
// protoc-gen-go v1.31.0
|
||||
// protoc v4.23.4
|
||||
// source: post.proto
|
||||
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
||||
// versions:
|
||||
// - protoc-gen-go-grpc v1.2.0
|
||||
// - protoc-gen-go-grpc v1.3.0
|
||||
// - protoc v4.23.4
|
||||
// source: post.proto
|
||||
|
||||
@@ -19,6 +33,17 @@ import (
|
||||
// Requires gRPC-Go v1.32.0 or later.
|
||||
const _ = grpc.SupportPackageIsVersion7
|
||||
|
||||
const (
|
||||
PostService_CreatePost_FullMethodName = "/panels.post.v1.PostService/CreatePost"
|
||||
PostService_GetPost_FullMethodName = "/panels.post.v1.PostService/GetPost"
|
||||
PostService_GetPanelPost_FullMethodName = "/panels.post.v1.PostService/GetPanelPost"
|
||||
PostService_UpdatePost_FullMethodName = "/panels.post.v1.PostService/UpdatePost"
|
||||
PostService_DeletePost_FullMethodName = "/panels.post.v1.PostService/DeletePost"
|
||||
PostService_GetFeedPosts_FullMethodName = "/panels.post.v1.PostService/GetFeedPosts"
|
||||
PostService_GetUserPosts_FullMethodName = "/panels.post.v1.PostService/GetUserPosts"
|
||||
PostService_GetPanelPosts_FullMethodName = "/panels.post.v1.PostService/GetPanelPosts"
|
||||
)
|
||||
|
||||
// PostServiceClient is the client API for PostService service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
||||
@@ -43,7 +68,7 @@ func NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {
|
||||
|
||||
func (c *postServiceClient) CreatePost(ctx context.Context, in *CreatePostRequest, opts ...grpc.CallOption) (*Post, error) {
|
||||
out := new(Post)
|
||||
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/CreatePost", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PostService_CreatePost_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -52,7 +77,7 @@ func (c *postServiceClient) CreatePost(ctx context.Context, in *CreatePostReques
|
||||
|
||||
func (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*Post, error) {
|
||||
out := new(Post)
|
||||
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPost", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -61,7 +86,7 @@ func (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opt
|
||||
|
||||
func (c *postServiceClient) GetPanelPost(ctx context.Context, in *GetPanelPostRequest, opts ...grpc.CallOption) (*Post, error) {
|
||||
out := new(Post)
|
||||
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPanelPost", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PostService_GetPanelPost_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -70,7 +95,7 @@ func (c *postServiceClient) GetPanelPost(ctx context.Context, in *GetPanelPostRe
|
||||
|
||||
func (c *postServiceClient) UpdatePost(ctx context.Context, in *UpdatePostRequest, opts ...grpc.CallOption) (*Post, error) {
|
||||
out := new(Post)
|
||||
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/UpdatePost", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PostService_UpdatePost_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -79,7 +104,7 @@ func (c *postServiceClient) UpdatePost(ctx context.Context, in *UpdatePostReques
|
||||
|
||||
func (c *postServiceClient) DeletePost(ctx context.Context, in *DeletePostRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||
out := new(emptypb.Empty)
|
||||
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/DeletePost", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PostService_DeletePost_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -88,7 +113,7 @@ func (c *postServiceClient) DeletePost(ctx context.Context, in *DeletePostReques
|
||||
|
||||
func (c *postServiceClient) GetFeedPosts(ctx context.Context, in *GetFeedPostsRequest, opts ...grpc.CallOption) (*FeedPosts, error) {
|
||||
out := new(FeedPosts)
|
||||
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetFeedPosts", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PostService_GetFeedPosts_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -97,7 +122,7 @@ func (c *postServiceClient) GetFeedPosts(ctx context.Context, in *GetFeedPostsRe
|
||||
|
||||
func (c *postServiceClient) GetUserPosts(ctx context.Context, in *GetUserPostsRequest, opts ...grpc.CallOption) (*UserPosts, error) {
|
||||
out := new(UserPosts)
|
||||
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetUserPosts", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PostService_GetUserPosts_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -106,7 +131,7 @@ func (c *postServiceClient) GetUserPosts(ctx context.Context, in *GetUserPostsRe
|
||||
|
||||
func (c *postServiceClient) GetPanelPosts(ctx context.Context, in *GetPanelPostsRequest, opts ...grpc.CallOption) (*PanelPosts, error) {
|
||||
out := new(PanelPosts)
|
||||
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPanelPosts", in, out, opts...)
|
||||
err := c.cc.Invoke(ctx, PostService_GetPanelPosts_FullMethodName, in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -179,7 +204,7 @@ func _PostService_CreatePost_Handler(srv interface{}, ctx context.Context, dec f
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.post.v1.PostService/CreatePost",
|
||||
FullMethod: PostService_CreatePost_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PostServiceServer).CreatePost(ctx, req.(*CreatePostRequest))
|
||||
@@ -197,7 +222,7 @@ func _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.post.v1.PostService/GetPost",
|
||||
FullMethod: PostService_GetPost_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))
|
||||
@@ -215,7 +240,7 @@ func _PostService_GetPanelPost_Handler(srv interface{}, ctx context.Context, dec
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.post.v1.PostService/GetPanelPost",
|
||||
FullMethod: PostService_GetPanelPost_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PostServiceServer).GetPanelPost(ctx, req.(*GetPanelPostRequest))
|
||||
@@ -233,7 +258,7 @@ func _PostService_UpdatePost_Handler(srv interface{}, ctx context.Context, dec f
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.post.v1.PostService/UpdatePost",
|
||||
FullMethod: PostService_UpdatePost_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PostServiceServer).UpdatePost(ctx, req.(*UpdatePostRequest))
|
||||
@@ -251,7 +276,7 @@ func _PostService_DeletePost_Handler(srv interface{}, ctx context.Context, dec f
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.post.v1.PostService/DeletePost",
|
||||
FullMethod: PostService_DeletePost_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PostServiceServer).DeletePost(ctx, req.(*DeletePostRequest))
|
||||
@@ -269,7 +294,7 @@ func _PostService_GetFeedPosts_Handler(srv interface{}, ctx context.Context, dec
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.post.v1.PostService/GetFeedPosts",
|
||||
FullMethod: PostService_GetFeedPosts_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PostServiceServer).GetFeedPosts(ctx, req.(*GetFeedPostsRequest))
|
||||
@@ -287,7 +312,7 @@ func _PostService_GetUserPosts_Handler(srv interface{}, ctx context.Context, dec
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.post.v1.PostService/GetUserPosts",
|
||||
FullMethod: PostService_GetUserPosts_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PostServiceServer).GetUserPosts(ctx, req.(*GetUserPostsRequest))
|
||||
@@ -305,7 +330,7 @@ func _PostService_GetPanelPosts_Handler(srv interface{}, ctx context.Context, de
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/panels.post.v1.PostService/GetPanelPosts",
|
||||
FullMethod: PostService_GetPanelPosts_FullMethodName,
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(PostServiceServer).GetPanelPosts(ctx, req.(*GetPanelPostsRequest))
|
||||
|
||||
@@ -1,15 +1,29 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package rpc
|
||||
|
||||
import (
|
||||
"net"
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/health"
|
||||
"google.golang.org/grpc/health/grpc_health_v1"
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
|
||||
|
||||
"github.com/hexolan/panels/post-service/internal"
|
||||
"github.com/hexolan/panels/post-service/internal/rpc/postv1"
|
||||
@@ -47,16 +61,16 @@ func loggingInterceptor(logger zerolog.Logger) logging.Logger {
|
||||
logger := logger.With().Fields(fields).Logger()
|
||||
|
||||
switch lvl {
|
||||
case logging.LevelError:
|
||||
logger.Error().Msg(msg)
|
||||
case logging.LevelWarn:
|
||||
logger.Warn().Msg(msg)
|
||||
case logging.LevelInfo:
|
||||
logger.Info().Msg(msg)
|
||||
case logging.LevelDebug:
|
||||
logger.Debug().Msg(msg)
|
||||
default:
|
||||
logger.Debug().Interface("unknown-log-level", lvl).Msg(msg)
|
||||
case logging.LevelError:
|
||||
logger.Error().Msg(msg)
|
||||
case logging.LevelWarn:
|
||||
logger.Warn().Msg(msg)
|
||||
case logging.LevelInfo:
|
||||
logger.Info().Msg(msg)
|
||||
case logging.LevelDebug:
|
||||
logger.Debug().Msg(msg)
|
||||
default:
|
||||
logger.Debug().Interface("unknown-log-level", lvl).Msg(msg)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -67,11 +81,11 @@ func (r *RPCServer) Serve() {
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("failed to listen on RPC port (:9090)")
|
||||
}
|
||||
|
||||
|
||||
// Begin serving RPC
|
||||
log.Info().Str("address", lis.Addr().String()).Msg("Attempting to serve RPC...")
|
||||
err = r.grpcSvr.Serve(lis)
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("failed to serve RPC")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
// Copyright 2023 Declan Teevan
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package service
|
||||
|
||||
import (
|
||||
@@ -17,7 +31,7 @@ type postService struct {
|
||||
func NewPostService(events producer.PostEventProducer, repo internal.PostRepository) internal.PostService {
|
||||
return postService{
|
||||
events: events,
|
||||
repo: repo,
|
||||
repo: repo,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +44,7 @@ func (srv postService) CreatePost(ctx context.Context, panelId string, authorId
|
||||
|
||||
// Create the post
|
||||
post, err := srv.repo.CreatePost(ctx, panelId, authorId, data)
|
||||
|
||||
|
||||
// Dispatch post created event
|
||||
if err == nil {
|
||||
srv.events.DispatchCreatedEvent(post)
|
||||
@@ -44,7 +58,7 @@ func (srv postService) GetPost(ctx context.Context, id internal.PostId) (*intern
|
||||
}
|
||||
|
||||
func (srv postService) GetPanelPost(ctx context.Context, id internal.PostId, panelId string) (*internal.Post, error) {
|
||||
panelId = strings.ToLower(panelId) // Panel IDs are case insensitive
|
||||
panelId = strings.ToLower(panelId) // Panel IDs are case insensitive
|
||||
return srv.repo.GetPanelPost(ctx, id, panelId)
|
||||
}
|
||||
|
||||
@@ -72,7 +86,7 @@ func (srv postService) UpdatePost(ctx context.Context, id internal.PostId, data
|
||||
|
||||
func (srv postService) DeletePost(ctx context.Context, id internal.PostId) error {
|
||||
err := srv.repo.DeletePost(ctx, id)
|
||||
|
||||
|
||||
// Dispatch post deleted event
|
||||
if err == nil {
|
||||
srv.events.DispatchDeletedEvent(id)
|
||||
@@ -91,4 +105,4 @@ func (srv postService) GetUserPosts(ctx context.Context, userId string) ([]*inte
|
||||
|
||||
func (srv postService) GetPanelPosts(ctx context.Context, panelId string) ([]*internal.Post, error) {
|
||||
return srv.repo.GetPanelPosts(ctx, panelId)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user