diff --git a/README.md b/README.md index 95becfe..d3de487 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ An event-driven microservices-based distributed e-commerce example application written in Golang. *(mouthful)* +[![Go Reference](https://pkg.go.dev/badge/github.com/hexolan/stocklet.svg)](https://pkg.go.dev/github.com/hexolan/stocklet) +[![License](https://img.shields.io/github/license/hexolan/stocklet?color=blue)](/LICENSE) +[![Go Report Card](https://goreportcard.com/badge/github.com/hexolan/stocklet)](https://goreportcard.com/report/github.com/hexolan/stocklet) + ## 📘 About This project was originally built as an experiment with event-driven architecture. But I hope it can future serve as a beneficial demonstration of utilising the architecture and exemplify the implementation of some other miscellaneous microservice patterns. diff --git a/cmd/service-init/migrations.go b/cmd/service-init/migrations.go index 50a0500..1e5cb26 100644 --- a/cmd/service-init/migrations.go +++ b/cmd/service-init/migrations.go @@ -39,5 +39,5 @@ func applyPostgresMigrations(conf *config.PostgresConfig) { } } - log.Info().Msg("migrate: succesfully performed postgres migrations") + log.Info().Msg("migrate: successfully performed postgres migrations") } diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index a145418..069aefb 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -65,6 +65,6 @@ func (cfg *SharedConfig) Load() error { return err } - // Config succesfully loaded + // Config successfully loaded return nil } diff --git a/internal/pkg/config/kafka.go b/internal/pkg/config/kafka.go index c99a320..738528b 100644 --- a/internal/pkg/config/kafka.go +++ b/internal/pkg/config/kafka.go @@ -32,9 +32,9 @@ func (cfg *KafkaConfig) Load() error { return err } - // Comma seperate the kafka brokers + // Comma separate the kafka brokers cfg.Brokers = strings.Split(brokersOpt, ",") - // Config options were succesfully loaded + // Config options were successfully loaded return nil } diff --git a/internal/pkg/config/otel.go b/internal/pkg/config/otel.go index 6fdaaca..fec59e6 100644 --- a/internal/pkg/config/otel.go +++ b/internal/pkg/config/otel.go @@ -28,6 +28,6 @@ func (cfg *OtelConfig) Load() error { cfg.CollectorGrpc = collectorGrpc } - // Succesfully loaded config properties + // Successfully loaded config properties return nil } diff --git a/internal/pkg/config/postgres.go b/internal/pkg/config/postgres.go index 7bedbb5..6d4dbdc 100644 --- a/internal/pkg/config/postgres.go +++ b/internal/pkg/config/postgres.go @@ -80,6 +80,6 @@ func (cfg *PostgresConfig) Load() error { cfg.Database = opt } - // Config properties succesfully loaded + // Config properties successfully loaded return nil } diff --git a/internal/svc/auth/auth.go b/internal/svc/auth/auth.go index db3c19b..c8c367c 100644 --- a/internal/svc/auth/auth.go +++ b/internal/svc/auth/auth.go @@ -41,7 +41,7 @@ type AuthService struct { } // Interface for database methods -// Allows implementing seperate controllers for different databases (e.g. Postgres, MongoDB, etc) +// Allows implementing separate controllers for different databases (e.g. Postgres, MongoDB, etc) type StorageController interface { SetPassword(ctx context.Context, userId string, password string) error VerifyPassword(ctx context.Context, userId string, password string) (bool, error) @@ -50,7 +50,7 @@ type StorageController interface { } // Interface for event consumption -// Flexibility for seperate controllers for different messaging systems (e.g. Kafka, NATS, etc) +// Flexibility for separate controllers for different messaging systems (e.g. Kafka, NATS, etc) type ConsumerController interface { messaging.ConsumerController diff --git a/internal/svc/auth/controller/kafka.go b/internal/svc/auth/controller/kafka.go index 6e4fbcb..901ba8d 100644 --- a/internal/svc/auth/controller/kafka.go +++ b/internal/svc/auth/controller/kafka.go @@ -79,7 +79,7 @@ func (c *kafkaController) Start() { case messaging.User_State_Deleted_Topic: c.consumeUserDeletedEventTopic(ft) default: - log.Warn().Str("topic", ft.Topic).Msg("consumer: recieved records from unexpected topic") + log.Warn().Str("topic", ft.Topic).Msg("consumer: received records from unexpected topic") } }) } @@ -91,7 +91,7 @@ func (c *kafkaController) Stop() { } func (c *kafkaController) consumeUserDeletedEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { diff --git a/internal/svc/order/controller/kafka.go b/internal/svc/order/controller/kafka.go index 42cb49d..819da60 100644 --- a/internal/svc/order/controller/kafka.go +++ b/internal/svc/order/controller/kafka.go @@ -95,7 +95,7 @@ func (c *kafkaController) Start() { case messaging.Payment_Processing_Topic: c.consumePaymentProcessedEventTopic(ft) default: - log.Warn().Str("topic", ft.Topic).Msg("consumer: recieved records from unexpected topic") + log.Warn().Str("topic", ft.Topic).Msg("consumer: received records from unexpected topic") } }) } @@ -107,7 +107,7 @@ func (c *kafkaController) Stop() { } func (c *kafkaController) consumeProductPriceQuoteEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { @@ -125,7 +125,7 @@ func (c *kafkaController) consumeProductPriceQuoteEventTopic(ft kgo.FetchTopic) } func (c *kafkaController) consumeStockReservationEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { @@ -143,7 +143,7 @@ func (c *kafkaController) consumeStockReservationEventTopic(ft kgo.FetchTopic) { } func (c *kafkaController) consumeShipmentAllocationEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { @@ -161,7 +161,7 @@ func (c *kafkaController) consumeShipmentAllocationEventTopic(ft kgo.FetchTopic) } func (c *kafkaController) consumePaymentProcessedEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { diff --git a/internal/svc/order/controller/postgres.go b/internal/svc/order/controller/postgres.go index ae9c0ac..58c38d1 100644 --- a/internal/svc/order/controller/postgres.go +++ b/internal/svc/order/controller/postgres.go @@ -108,7 +108,7 @@ func (c postgresController) CreateOrder(ctx context.Context, orderObj *pb.Order) // Create records for any order items err = c.createOrderItems(ctx, tx, newOrder.Id, newOrder.Items) if err != nil { - // The deffered rollback will be called (so the transaction will not be commited) + // The deffered rollback will be called (so the transaction will not be committed) return nil, err } diff --git a/internal/svc/order/order.go b/internal/svc/order/order.go index 592c20d..71744d3 100644 --- a/internal/svc/order/order.go +++ b/internal/svc/order/order.go @@ -39,7 +39,7 @@ type OrderService struct { } // Interface for database methods -// Flexibility for implementing seperate controllers for different databases (e.g. Postgres, MongoDB, etc) +// Flexibility for implementing separate controllers for different databases (e.g. Postgres, MongoDB, etc) type StorageController interface { GetOrder(ctx context.Context, orderId string) (*pb.Order, error) GetCustomerOrders(ctx context.Context, customerId string) ([]*pb.Order, error) @@ -52,7 +52,7 @@ type StorageController interface { } // Interface for event consumption -// Flexibility for seperate controllers for different messaging systems (e.g. Kafka, NATS, etc) +// Flexibility for separate controllers for different messaging systems (e.g. Kafka, NATS, etc) type ConsumerController interface { messaging.ConsumerController diff --git a/internal/svc/payment/controller/kafka.go b/internal/svc/payment/controller/kafka.go index cbb7583..f61c4ff 100644 --- a/internal/svc/payment/controller/kafka.go +++ b/internal/svc/payment/controller/kafka.go @@ -92,7 +92,7 @@ func (c *kafkaController) Start() { case messaging.Shipping_Shipment_Allocation_Topic: c.consumeShipmentAllocationEventTopic(ft) default: - log.Warn().Str("topic", ft.Topic).Msg("consumer: recieved records from unexpected topic") + log.Warn().Str("topic", ft.Topic).Msg("consumer: received records from unexpected topic") } }) } @@ -104,7 +104,7 @@ func (c *kafkaController) Stop() { } func (c *kafkaController) consumeUserCreatedEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { @@ -122,7 +122,7 @@ func (c *kafkaController) consumeUserCreatedEventTopic(ft kgo.FetchTopic) { } func (c *kafkaController) consumeShipmentAllocationEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { diff --git a/internal/svc/payment/controller/postgres.go b/internal/svc/payment/controller/postgres.go index 55d97fb..6dc9c73 100644 --- a/internal/svc/payment/controller/postgres.go +++ b/internal/svc/payment/controller/postgres.go @@ -313,7 +313,7 @@ func (c postgresController) PaymentForOrder(ctx context.Context, orderId string, evtTopic string ) if transaction != nil { - // Succesful + // Successful evt, evtTopic, err = payment.PreparePaymentProcessedEvent_Success(transaction) } else { // Failure @@ -321,7 +321,7 @@ func (c postgresController) PaymentForOrder(ctx context.Context, orderId string, evt, evtTopic, err = payment.PreparePaymentProcessedEvent_Failure(orderId, customerId, amount) } - // Ensure the event was prepared succesfully + // Ensure the event was prepared successfully if err != nil { return errors.WrapServiceError(errors.ErrCodeService, "failed to create event", err) } diff --git a/internal/svc/payment/payment.go b/internal/svc/payment/payment.go index 9f3a12f..b21f2eb 100644 --- a/internal/svc/payment/payment.go +++ b/internal/svc/payment/payment.go @@ -38,7 +38,7 @@ type PaymentService struct { } // Interface for database methods -// Flexibility for implementing seperate controllers for different databases (e.g. Postgres, MongoDB, etc) +// Flexibility for implementing separate controllers for different databases (e.g. Postgres, MongoDB, etc) type StorageController interface { GetBalance(ctx context.Context, customerId string) (*pb.CustomerBalance, error) GetTransaction(ctx context.Context, transactionId string) (*pb.Transaction, error) @@ -52,7 +52,7 @@ type StorageController interface { } // Interface for event consumption -// Flexibility for seperate controllers for different messaging systems (e.g. Kafka, NATS, etc) +// Flexibility for separate controllers for different messaging systems (e.g. Kafka, NATS, etc) type ConsumerController interface { messaging.ConsumerController diff --git a/internal/svc/product/controller/kafka.go b/internal/svc/product/controller/kafka.go index 5908be4..491d121 100644 --- a/internal/svc/product/controller/kafka.go +++ b/internal/svc/product/controller/kafka.go @@ -84,7 +84,7 @@ func (c *kafkaController) Start() { case messaging.Order_State_Created_Topic: c.consumeOrderCreatedEventTopic(ft) default: - log.Warn().Str("topic", ft.Topic).Msg("consumer: recieved records from unexpected topic") + log.Warn().Str("topic", ft.Topic).Msg("consumer: received records from unexpected topic") } }) } @@ -96,7 +96,7 @@ func (c *kafkaController) Stop() { } func (c *kafkaController) consumeOrderCreatedEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { diff --git a/internal/svc/product/product.go b/internal/svc/product/product.go index d74cd64..6b36a49 100644 --- a/internal/svc/product/product.go +++ b/internal/svc/product/product.go @@ -38,7 +38,7 @@ type ProductService struct { } // Interface for database methods -// Flexibility for implementing seperate controllers for different databases (e.g. Postgres, MongoDB, etc) +// Flexibility for implementing separate controllers for different databases (e.g. Postgres, MongoDB, etc) type StorageController interface { GetProduct(ctx context.Context, productId string) (*pb.Product, error) GetProducts(ctx context.Context) ([]*pb.Product, error) @@ -50,7 +50,7 @@ type StorageController interface { } // Interface for event consumption -// Flexibility for seperate controllers for different messaging systems (e.g. Kafka, NATS, etc) +// Flexibility for separate controllers for different messaging systems (e.g. Kafka, NATS, etc) type ConsumerController interface { messaging.ConsumerController diff --git a/internal/svc/shipping/controller/kafka.go b/internal/svc/shipping/controller/kafka.go index 144b42c..9cf8a92 100644 --- a/internal/svc/shipping/controller/kafka.go +++ b/internal/svc/shipping/controller/kafka.go @@ -87,7 +87,7 @@ func (c *kafkaController) Start() { case messaging.Payment_Processing_Topic: c.consumePaymentProcessedEventTopic(ft) default: - log.Warn().Str("topic", ft.Topic).Msg("consumer: recieved records from unexpected topic") + log.Warn().Str("topic", ft.Topic).Msg("consumer: received records from unexpected topic") } }) } @@ -99,7 +99,7 @@ func (c *kafkaController) Stop() { } func (c *kafkaController) consumeStockReservationEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { @@ -117,7 +117,7 @@ func (c *kafkaController) consumeStockReservationEventTopic(ft kgo.FetchTopic) { } func (c *kafkaController) consumePaymentProcessedEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { diff --git a/internal/svc/shipping/shipping.go b/internal/svc/shipping/shipping.go index 9db0c4a..ea2a6f2 100644 --- a/internal/svc/shipping/shipping.go +++ b/internal/svc/shipping/shipping.go @@ -38,7 +38,7 @@ type ShippingService struct { } // Interface for database methods -// Flexibility for implementing seperate controllers for different databases (e.g. Postgres, MongoDB, etc) +// Flexibility for implementing separate controllers for different databases (e.g. Postgres, MongoDB, etc) type StorageController interface { GetShipment(ctx context.Context, shipmentId string) (*pb.Shipment, error) GetShipmentItems(ctx context.Context, shipmentId string) ([]*pb.ShipmentItem, error) @@ -48,7 +48,7 @@ type StorageController interface { } // Interface for event consumption -// Flexibility for seperate controllers for different messaging systems (e.g. Kafka, NATS, etc) +// Flexibility for separate controllers for different messaging systems (e.g. Kafka, NATS, etc) type ConsumerController interface { messaging.ConsumerController diff --git a/internal/svc/user/user.go b/internal/svc/user/user.go index a3ab951..11c0248 100644 --- a/internal/svc/user/user.go +++ b/internal/svc/user/user.go @@ -36,7 +36,7 @@ type UserService struct { } // Interface for database methods -// Flexibility for implementing seperate controllers for different databases (e.g. Postgres, MongoDB, etc) +// Flexibility for implementing separate controllers for different databases (e.g. Postgres, MongoDB, etc) type StorageController interface { GetUser(ctx context.Context, userId string) (*pb.User, error) @@ -47,7 +47,7 @@ type StorageController interface { } // Interface for event consumption -// Flexibility for seperate controllers for different messaging systems (e.g. Kafka, NATS, etc) +// Flexibility for separate controllers for different messaging systems (e.g. Kafka, NATS, etc) type ConsumerController interface { messaging.ConsumerController diff --git a/internal/svc/warehouse/controller/kafka.go b/internal/svc/warehouse/controller/kafka.go index 79e0745..f9f1210 100644 --- a/internal/svc/warehouse/controller/kafka.go +++ b/internal/svc/warehouse/controller/kafka.go @@ -95,7 +95,7 @@ func (c *kafkaController) Start() { case messaging.Payment_Processing_Topic: c.consumePaymentProcessedEventTopic(ft) default: - log.Warn().Str("topic", ft.Topic).Msg("consumer: recieved records from unexpected topic") + log.Warn().Str("topic", ft.Topic).Msg("consumer: received records from unexpected topic") } }) } @@ -107,7 +107,7 @@ func (c *kafkaController) Stop() { } func (c *kafkaController) consumeOrderPendingEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { @@ -125,7 +125,7 @@ func (c *kafkaController) consumeOrderPendingEventTopic(ft kgo.FetchTopic) { } func (c *kafkaController) consumeShipmentAllocationEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { @@ -143,7 +143,7 @@ func (c *kafkaController) consumeShipmentAllocationEventTopic(ft kgo.FetchTopic) } func (c *kafkaController) consumePaymentProcessedEventTopic(ft kgo.FetchTopic) { - log.Info().Str("topic", ft.Topic).Msg("consumer: recieved records from topic") + log.Info().Str("topic", ft.Topic).Msg("consumer: received records from topic") // Process each message from the topic ft.EachRecord(func(record *kgo.Record) { diff --git a/internal/svc/warehouse/warehouse.go b/internal/svc/warehouse/warehouse.go index f5ce6c9..adf71c9 100644 --- a/internal/svc/warehouse/warehouse.go +++ b/internal/svc/warehouse/warehouse.go @@ -38,7 +38,7 @@ type WarehouseService struct { } // Interface for database methods -// Flexibility for implementing seperate controllers for different databases (e.g. Postgres, MongoDB, etc) +// Flexibility for implementing separate controllers for different databases (e.g. Postgres, MongoDB, etc) type StorageController interface { GetProductStock(ctx context.Context, productId string) (*pb.ProductStock, error) GetReservation(ctx context.Context, reservationId string) (*pb.Reservation, error) @@ -51,7 +51,7 @@ type StorageController interface { } // Interface for event consumption -// Flexibility for seperate controllers for different messaging systems (e.g. Kafka, NATS, etc) +// Flexibility for separate controllers for different messaging systems (e.g. Kafka, NATS, etc) type ConsumerController interface { messaging.ConsumerController