✨ Add configuration for Code Review Automation and enhance .gitignore. Introduce .coderabbit.yml for automated reviews with profiles for correctness, maintainability, security, and performance. Update paths to include relevant directories and exclude generated files. Modify .gitignore to include coverage reports and generated files. Refactor Docker Compose to use updated paths for database initialization scripts. Update Go module dependencies and enhance Makefile with new code generation tasks. Transition domain models to a new DTO structure for better separation of concerns.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
package model
|
||||
package dto
|
||||
|
||||
import (
|
||||
"time"
|
||||
@@ -1,13 +1,13 @@
|
||||
package mapper
|
||||
|
||||
import "caatsm/internal/model"
|
||||
import "caatsm/internal/adapter/dto"
|
||||
|
||||
// Mapper defines the interface for mapping between pipeline models and database models
|
||||
type Mapper interface {
|
||||
// ToDBRow converts a ParsedTelegram to a database row representation
|
||||
ToDBRow(msg *model.ParsedTelegram) ([]interface{}, error)
|
||||
ToDBRow(msg *dto.ParsedTelegram) ([]interface{}, error)
|
||||
|
||||
// FromDBRow converts a database row to a ParsedTelegram
|
||||
FromDBRow(row []interface{}) (*model.ParsedTelegram, error)
|
||||
FromDBRow(row []interface{}) (*dto.ParsedTelegram, error)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package mapper
|
||||
|
||||
import (
|
||||
"caatsm/internal/model"
|
||||
"caatsm/internal/adapter/dto"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
@@ -18,7 +18,7 @@ func NewTelegramMapper() *TelegramMapper {
|
||||
}
|
||||
|
||||
// ToDBRow converts a ParsedTelegram to a database row representation
|
||||
func (m *TelegramMapper) ToDBRow(msg *model.ParsedTelegram) ([]interface{}, error) {
|
||||
func (m *TelegramMapper) ToDBRow(msg *dto.ParsedTelegram) ([]interface{}, error) {
|
||||
// Parse UUID
|
||||
var msgUUID uuid.UUID
|
||||
var err error
|
||||
@@ -45,7 +45,7 @@ func (m *TelegramMapper) ToDBRow(msg *model.ParsedTelegram) ([]interface{}, erro
|
||||
|
||||
status := msg.Status
|
||||
if status == "" {
|
||||
status = model.MessageStatusUnknown
|
||||
status = dto.MessageStatusUnknown
|
||||
}
|
||||
|
||||
return []interface{}{
|
||||
@@ -70,7 +70,7 @@ func (m *TelegramMapper) ToDBRow(msg *model.ParsedTelegram) ([]interface{}, erro
|
||||
}
|
||||
|
||||
// FromDBRow converts a database row to a ParsedTelegram
|
||||
func (m *TelegramMapper) FromDBRow(row []interface{}) (*model.ParsedTelegram, error) {
|
||||
func (m *TelegramMapper) FromDBRow(row []interface{}) (*dto.ParsedTelegram, error) {
|
||||
const expectedColumns = 17
|
||||
if len(row) < expectedColumns {
|
||||
return nil, fmt.Errorf("expected %d columns, got %d", expectedColumns, len(row))
|
||||
@@ -128,12 +128,12 @@ func (m *TelegramMapper) FromDBRow(row []interface{}) (*model.ParsedTelegram, er
|
||||
}
|
||||
}
|
||||
|
||||
status := model.MessageStatusUnknown
|
||||
status := dto.MessageStatusUnknown
|
||||
if rawStatus := toString(row[11]); rawStatus != "" {
|
||||
status = model.MessageStatus(rawStatus)
|
||||
status = dto.MessageStatus(rawStatus)
|
||||
}
|
||||
|
||||
return &model.ParsedTelegram{
|
||||
return &dto.ParsedTelegram{
|
||||
Uuid: msgUUID.String(),
|
||||
MessageID: toString(row[1]),
|
||||
DateTime: toString(row[2]),
|
||||
|
||||
@@ -3,7 +3,7 @@ package mapper
|
||||
import (
|
||||
"time"
|
||||
|
||||
"caatsm/internal/model"
|
||||
"caatsm/internal/adapter/dto"
|
||||
|
||||
"github.com/google/uuid"
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
@@ -19,7 +19,7 @@ var _ = Describe("TelegramMapper", func() {
|
||||
|
||||
Describe("ToDBRow", func() {
|
||||
It("generates a UUID when missing", func() {
|
||||
msg := &model.ParsedTelegram{}
|
||||
msg := &dto.ParsedTelegram{}
|
||||
|
||||
row, err := mapper.ToDBRow(msg)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
@@ -33,7 +33,7 @@ var _ = Describe("TelegramMapper", func() {
|
||||
Describe("FromDBRow", func() {
|
||||
It("round-trips telegram data", func() {
|
||||
now := time.Now().UTC()
|
||||
original := &model.ParsedTelegram{
|
||||
original := &dto.ParsedTelegram{
|
||||
Uuid: uuid.NewString(),
|
||||
MessageID: "TMQ1324",
|
||||
DateTime: "150631",
|
||||
@@ -49,7 +49,7 @@ var _ = Describe("TelegramMapper", func() {
|
||||
ParsedAt: now,
|
||||
DispatchedAt: now,
|
||||
NeedDispatch: true,
|
||||
Status: model.MessageStatusParsed,
|
||||
Status: dto.MessageStatusParsed,
|
||||
}
|
||||
|
||||
row, err := mapper.ToDBRow(original)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package parsers
|
||||
package parser
|
||||
|
||||
import (
|
||||
"caatsm/internal/domain"
|
||||
"caatsm/internal/model"
|
||||
"caatsm/internal/adapter/dto"
|
||||
"errors"
|
||||
"fmt"
|
||||
"regexp"
|
||||
@@ -200,14 +200,14 @@ func (parser *BodyParser) createBodyData(data map[string]string) (string, interf
|
||||
}
|
||||
}
|
||||
|
||||
func Parse(rawText string) (*model.ParsedTelegram, error) {
|
||||
func Parse(rawText string) (*dto.ParsedTelegram, error) {
|
||||
header, err := ParseHeader(rawText)
|
||||
if err != nil {
|
||||
msg := model.NewParsedTelegram()
|
||||
msg := dto.NewParsedTelegram()
|
||||
msg.Content = rawText
|
||||
msg.Comments = err.Error()
|
||||
msg.ErrorReason = err.Error()
|
||||
msg.Status = model.MessageStatusHeaderError
|
||||
msg.Status = dto.MessageStatusHeaderError
|
||||
return msg, fmt.Errorf("%w: %w", ErrHeaderParse, err)
|
||||
}
|
||||
|
||||
@@ -217,7 +217,7 @@ func Parse(rawText string) (*model.ParsedTelegram, error) {
|
||||
header.ParsedAt = time.Now()
|
||||
|
||||
if bodyErr != nil {
|
||||
return &model.ParsedTelegram{
|
||||
return &dto.ParsedTelegram{
|
||||
MessageID: header.MessageID,
|
||||
DateTime: header.DateTime,
|
||||
PriorityIndicator: header.PriorityIndicator,
|
||||
@@ -232,12 +232,12 @@ func Parse(rawText string) (*model.ParsedTelegram, error) {
|
||||
ParsedAt: header.ParsedAt,
|
||||
Parsed: false,
|
||||
Comments: bodyErr.Error(),
|
||||
Status: model.MessageStatusBodyError,
|
||||
Status: dto.MessageStatusBodyError,
|
||||
ErrorReason: bodyErr.Error(),
|
||||
}, fmt.Errorf("%w: %w", ErrBodyParse, bodyErr)
|
||||
}
|
||||
|
||||
parsed := &model.ParsedTelegram{
|
||||
parsed := &dto.ParsedTelegram{
|
||||
MessageID: header.MessageID,
|
||||
DateTime: header.DateTime,
|
||||
PriorityIndicator: header.PriorityIndicator,
|
||||
@@ -252,7 +252,7 @@ func Parse(rawText string) (*model.ParsedTelegram, error) {
|
||||
ReceivedAt: header.ReceivedAt,
|
||||
ParsedAt: header.ParsedAt,
|
||||
Parsed: true,
|
||||
Status: model.MessageStatusParsed,
|
||||
Status: dto.MessageStatusParsed,
|
||||
ErrorReason: "",
|
||||
}
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
package parser
|
||||
|
||||
import (
|
||||
"caatsm/internal/model"
|
||||
"caatsm/internal/parsers"
|
||||
)
|
||||
|
||||
// AviationParser implements the Parser interface using the existing parsers package
|
||||
type AviationParser struct{}
|
||||
|
||||
// NewAviationParser creates a new aviation parser
|
||||
func NewAviationParser() *AviationParser {
|
||||
return &AviationParser{}
|
||||
}
|
||||
|
||||
// Parse parses a raw message string and returns a ParsedTelegram
|
||||
func (p *AviationParser) Parse(rawText string) (*model.ParsedTelegram, error) {
|
||||
// Use the existing Parse function from internal/parsers
|
||||
return parsers.Parse(rawText)
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package parsers
|
||||
package parser
|
||||
|
||||
import (
|
||||
"caatsm/internal/domain"
|
||||
@@ -1,4 +1,4 @@
|
||||
package parsers
|
||||
package parser
|
||||
|
||||
import "regexp"
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package parser
|
||||
|
||||
import "caatsm/internal/model"
|
||||
import "caatsm/internal/adapter/dto"
|
||||
|
||||
// Parser defines the interface for parsing raw telegram messages
|
||||
type Parser interface {
|
||||
// Parse parses a raw message string and returns a ParsedTelegram
|
||||
Parse(rawText string) (*model.ParsedTelegram, error)
|
||||
Parse(rawText string) (*dto.ParsedTelegram, error)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package parsers
|
||||
package parser
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
@@ -1,4 +1,4 @@
|
||||
package parsers
|
||||
package parser
|
||||
|
||||
import (
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
@@ -1,7 +1,17 @@
|
||||
package parser
|
||||
|
||||
import "caatsm/internal/adapter/dto"
|
||||
|
||||
// AviationParser implements the Parser interface
|
||||
type AviationParser struct{}
|
||||
|
||||
// Parse parses a raw message string and returns a ParsedTelegram
|
||||
func (p *AviationParser) Parse(rawText string) (*dto.ParsedTelegram, error) {
|
||||
return Parse(rawText)
|
||||
}
|
||||
|
||||
// ProvideParser creates a parser instance
|
||||
func ProvideParser() Parser {
|
||||
return NewAviationParser()
|
||||
return &AviationParser{}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package parsers
|
||||
package parser
|
||||
|
||||
import (
|
||||
"caatsm/internal/domain"
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package parsers
|
||||
package parser
|
||||
|
||||
import (
|
||||
"strings"
|
||||
@@ -1,4 +1,4 @@
|
||||
package parsers
|
||||
package parser
|
||||
|
||||
import (
|
||||
"testing"
|
||||
+16
-16
@@ -1,11 +1,11 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"caatsm/internal/adapter"
|
||||
"caatsm/internal/adapter/parser"
|
||||
"caatsm/internal/model"
|
||||
obslogging "caatsm/internal/observability/logging"
|
||||
"caatsm/internal/observability/telemetry"
|
||||
"caatsm/internal/adapter/dto"
|
||||
"caatsm/internal/infra/log"
|
||||
"caatsm/internal/infra/telemetry"
|
||||
"caatsm/internal/port"
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
@@ -21,15 +21,15 @@ import (
|
||||
// MessageProcessor handles message processing
|
||||
type MessageProcessor struct {
|
||||
parser parser.Parser
|
||||
repository adapter.Repository
|
||||
publisher adapter.Publisher
|
||||
repository port.Repository
|
||||
publisher port.Publisher
|
||||
logger *zap.Logger
|
||||
telemetry telemetry.Recorder
|
||||
}
|
||||
|
||||
// ProcessingStatus represents the outcome of the processing pipeline
|
||||
// (persistence, publishing, etc.), independent from the parsing status
|
||||
// captured in model.MessageStatus.
|
||||
// captured in dto.MessageStatus.
|
||||
type ProcessingStatus string
|
||||
|
||||
const (
|
||||
@@ -41,8 +41,8 @@ const (
|
||||
// NewMessageProcessor creates a new message processor
|
||||
func NewMessageProcessor(
|
||||
parser parser.Parser,
|
||||
repository adapter.Repository,
|
||||
publisher adapter.Publisher,
|
||||
repository port.Repository,
|
||||
publisher port.Publisher,
|
||||
rec telemetry.Recorder,
|
||||
logger *zap.Logger,
|
||||
) *MessageProcessor {
|
||||
@@ -70,10 +70,10 @@ func (p *MessageProcessor) Handle(ctx context.Context, raw []byte, msgID string)
|
||||
|
||||
parsed, parseErr := p.parser.Parse(string(raw))
|
||||
if parsed == nil {
|
||||
parsed = model.NewParsedTelegram()
|
||||
parsed = dto.NewParsedTelegram()
|
||||
parsed.Content = string(raw)
|
||||
parsed.ErrorReason = "parser returned nil"
|
||||
parsed.Status = model.MessageStatusBodyError
|
||||
parsed.Status = dto.MessageStatusBodyError
|
||||
parseErr = fmt.Errorf("parser returned nil")
|
||||
}
|
||||
|
||||
@@ -90,11 +90,11 @@ func (p *MessageProcessor) Handle(ctx context.Context, raw []byte, msgID string)
|
||||
if parsed.ParsedAt.IsZero() {
|
||||
parsed.ParsedAt = time.Now()
|
||||
}
|
||||
if parsed.Status == model.MessageStatusUnknown {
|
||||
if parsed.Status == dto.MessageStatusUnknown {
|
||||
if parseErr == nil {
|
||||
parsed.Status = model.MessageStatusParsed
|
||||
parsed.Status = dto.MessageStatusParsed
|
||||
} else {
|
||||
parsed.Status = model.MessageStatusBodyError
|
||||
parsed.Status = dto.MessageStatusBodyError
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ func (p *MessageProcessor) Handle(ctx context.Context, raw []byte, msgID string)
|
||||
attribute.String("telegram.status", string(parsed.Status)),
|
||||
)
|
||||
|
||||
msgLogger := obslogging.WithMessageContext(p.logger, obslogging.MessageFields{
|
||||
msgLogger := log.WithMessageContext(p.logger, log.MessageFields{
|
||||
Service: "caatsm-processor",
|
||||
TransportMsgID: msgID,
|
||||
BusinessMsgID: parsed.MessageID,
|
||||
@@ -191,7 +191,7 @@ func (p *MessageProcessor) Handle(ctx context.Context, raw []byte, msgID string)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MessageProcessor) persistRaw(ctx context.Context, msg *model.ParsedTelegram) {
|
||||
func (p *MessageProcessor) persistRaw(ctx context.Context, msg *dto.ParsedTelegram) {
|
||||
if msg == nil || p.repository == nil {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"caatsm/internal/adapter"
|
||||
"caatsm/internal/adapter/parser"
|
||||
"caatsm/internal/model"
|
||||
"caatsm/internal/observability/telemetry"
|
||||
"caatsm/internal/adapter/dto"
|
||||
"caatsm/internal/infra/telemetry"
|
||||
"caatsm/internal/port"
|
||||
|
||||
"github.com/google/uuid"
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
@@ -52,7 +52,7 @@ var _ = Describe("MessageProcessor", func() {
|
||||
|
||||
It("preserves UUIDs and appends nats message id comment", func() {
|
||||
originalUUID := uuid.NewString()
|
||||
parserStub.value = &model.ParsedTelegram{Uuid: originalUUID, Parsed: true, Status: model.MessageStatusParsed}
|
||||
parserStub.value = &dto.ParsedTelegram{Uuid: originalUUID, Parsed: true, Status: dto.MessageStatusParsed}
|
||||
|
||||
Expect(proc.Handle(ctx, []byte("payload"), "msg-123")).To(Succeed())
|
||||
|
||||
@@ -63,7 +63,7 @@ var _ = Describe("MessageProcessor", func() {
|
||||
})
|
||||
|
||||
It("treats publisher failures as permanent and stores raw entries", func() {
|
||||
parserStub.value = &model.ParsedTelegram{Parsed: true, Status: model.MessageStatusParsed}
|
||||
parserStub.value = &dto.ParsedTelegram{Parsed: true, Status: dto.MessageStatusParsed}
|
||||
pub.err = errors.New("publish failed")
|
||||
|
||||
err := proc.Handle(ctx, []byte("payload"), "id-3")
|
||||
@@ -71,15 +71,15 @@ var _ = Describe("MessageProcessor", func() {
|
||||
Expect(IsPermanent(err)).To(BeTrue())
|
||||
Expect(repo.last()).NotTo(BeNil())
|
||||
Expect(repo.rawCount()).To(Equal(1))
|
||||
Expect(repo.lastRaw().Status).To(Equal(model.MessageStatusParsed))
|
||||
Expect(repo.lastRaw().Status).To(Equal(dto.MessageStatusParsed))
|
||||
Expect(repo.lastRaw().ErrorReason).To(ContainSubstring("publish failed"))
|
||||
})
|
||||
|
||||
It("sets timestamps when missing", func() {
|
||||
parserStub.value = &model.ParsedTelegram{
|
||||
parserStub.value = &dto.ParsedTelegram{
|
||||
Uuid: uuid.NewString(),
|
||||
Parsed: true,
|
||||
Status: model.MessageStatusParsed,
|
||||
Status: dto.MessageStatusParsed,
|
||||
}
|
||||
pub.err = nil
|
||||
|
||||
@@ -97,10 +97,10 @@ var _ = Describe("MessageProcessor", func() {
|
||||
It("does not override provided timestamps", func() {
|
||||
received := time.Now().Add(-2 * time.Minute)
|
||||
parsedAt := time.Now().Add(-1 * time.Minute)
|
||||
parserStub.value = &model.ParsedTelegram{
|
||||
parserStub.value = &dto.ParsedTelegram{
|
||||
Uuid: uuid.NewString(),
|
||||
Parsed: true,
|
||||
Status: model.MessageStatusParsed,
|
||||
Status: dto.MessageStatusParsed,
|
||||
ReceivedAt: received,
|
||||
ParsedAt: parsedAt,
|
||||
}
|
||||
@@ -114,10 +114,10 @@ var _ = Describe("MessageProcessor", func() {
|
||||
core, logs := observer.New(zap.WarnLevel)
|
||||
logger := zap.New(core)
|
||||
parserStub = &stubParser{
|
||||
value: &model.ParsedTelegram{
|
||||
value: &dto.ParsedTelegram{
|
||||
Content: strings.Repeat("x", 1024),
|
||||
Parsed: false,
|
||||
Status: model.MessageStatusBodyError,
|
||||
Status: dto.MessageStatusBodyError,
|
||||
ErrorReason: "parse failure",
|
||||
},
|
||||
err: errors.New("parse failure"),
|
||||
@@ -145,27 +145,27 @@ var _ = Describe("MessageProcessor", func() {
|
||||
})
|
||||
})
|
||||
|
||||
func newTestProcessor(p parser.Parser, repo adapter.Repository, pub adapter.Publisher) *MessageProcessor {
|
||||
func newTestProcessor(p parser.Parser, repo port.Repository, pub port.Publisher) *MessageProcessor {
|
||||
return NewMessageProcessor(p, repo, pub, telemetry.NewNoop(), zap.NewNop())
|
||||
}
|
||||
|
||||
type stubParser struct {
|
||||
value *model.ParsedTelegram
|
||||
value *dto.ParsedTelegram
|
||||
err error
|
||||
}
|
||||
|
||||
func (s *stubParser) Parse(rawText string) (*model.ParsedTelegram, error) {
|
||||
func (s *stubParser) Parse(rawText string) (*dto.ParsedTelegram, error) {
|
||||
return s.value, s.err
|
||||
}
|
||||
|
||||
type stubRepository struct {
|
||||
inserted []*model.ParsedTelegram
|
||||
raw []*model.ParsedTelegram
|
||||
inserted []*dto.ParsedTelegram
|
||||
raw []*dto.ParsedTelegram
|
||||
err error
|
||||
rawErr error
|
||||
}
|
||||
|
||||
func (s *stubRepository) InsertOne(ctx context.Context, msg *model.ParsedTelegram) error {
|
||||
func (s *stubRepository) InsertOne(ctx context.Context, msg *dto.ParsedTelegram) error {
|
||||
if s.err != nil {
|
||||
return s.err
|
||||
}
|
||||
@@ -173,11 +173,11 @@ func (s *stubRepository) InsertOne(ctx context.Context, msg *model.ParsedTelegra
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *stubRepository) InsertBatch(ctx context.Context, msgs []*model.ParsedTelegram) error {
|
||||
func (s *stubRepository) InsertBatch(ctx context.Context, msgs []*dto.ParsedTelegram) error {
|
||||
return errors.New("not implemented")
|
||||
}
|
||||
|
||||
func (s *stubRepository) InsertRaw(ctx context.Context, msg *model.ParsedTelegram) error {
|
||||
func (s *stubRepository) InsertRaw(ctx context.Context, msg *dto.ParsedTelegram) error {
|
||||
if s.rawErr != nil {
|
||||
return s.rawErr
|
||||
}
|
||||
@@ -185,14 +185,14 @@ func (s *stubRepository) InsertRaw(ctx context.Context, msg *model.ParsedTelegra
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *stubRepository) last() *model.ParsedTelegram {
|
||||
func (s *stubRepository) last() *dto.ParsedTelegram {
|
||||
if len(s.inserted) == 0 {
|
||||
return nil
|
||||
}
|
||||
return s.inserted[len(s.inserted)-1]
|
||||
}
|
||||
|
||||
func (s *stubRepository) lastRaw() *model.ParsedTelegram {
|
||||
func (s *stubRepository) lastRaw() *dto.ParsedTelegram {
|
||||
if len(s.raw) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -83,5 +83,5 @@ NeedDispatch: false.
|
||||
*/
|
||||
|
||||
// NOTE: Parsed telegram pipeline structures (ParsedTelegram, MessageStatus, etc.)
|
||||
// have been moved to the internal/model package to keep the domain layer focused
|
||||
// have been moved to the internal/adapter/dto package to keep the domain layer focused
|
||||
// purely on aviation business concepts (FPL, DEP, ARR, etc.).
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
package iface
|
||||
|
||||
import "caatsm/internal/infra/config"
|
||||
|
||||
type MessageHandler interface {
|
||||
HandleMessage(msg []byte, id string) error
|
||||
}
|
||||
|
||||
type MessagePublisher interface {
|
||||
Publish(message interface{}) error
|
||||
}
|
||||
|
||||
type MessageSubscriber interface {
|
||||
Subscribe(config *config.Config) error
|
||||
}
|
||||
|
||||
type MessageRepository interface {
|
||||
CreateNew(message interface{}) error
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package logging
|
||||
package log
|
||||
|
||||
import "go.uber.org/zap"
|
||||
|
||||
@@ -3,7 +3,7 @@ package monitoring
|
||||
import (
|
||||
"caatsm/internal/infra/buildinfo"
|
||||
"caatsm/internal/infra/config"
|
||||
obsmetrics "caatsm/internal/observability/metrics"
|
||||
obsmetrics "caatsm/internal/infra/metrics"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
|
||||
@@ -3,9 +3,9 @@ package nats
|
||||
import (
|
||||
"caatsm/internal/app"
|
||||
"caatsm/internal/infra/config"
|
||||
obslogging "caatsm/internal/observability/logging"
|
||||
obsmetrics "caatsm/internal/observability/metrics"
|
||||
"caatsm/internal/observability/telemetry"
|
||||
"caatsm/internal/infra/log"
|
||||
obsmetrics "caatsm/internal/infra/metrics"
|
||||
"caatsm/internal/infra/telemetry"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
@@ -792,7 +792,7 @@ func (c *Consumer) processMessage(ctx context.Context, msg *nats.Msg) error {
|
||||
)
|
||||
}
|
||||
|
||||
msgLogger := obslogging.WithMessageContext(c.logger, obslogging.MessageFields{
|
||||
msgLogger := log.WithMessageContext(c.logger, log.MessageFields{
|
||||
Service: "caatsm-consumer",
|
||||
TransportMsgID: msgID,
|
||||
Stream: c.streamName,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package nats
|
||||
|
||||
import (
|
||||
"caatsm/internal/adapter"
|
||||
"caatsm/internal/infra/config"
|
||||
"caatsm/internal/model"
|
||||
"caatsm/internal/adapter/dto"
|
||||
"caatsm/internal/port"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
@@ -25,7 +25,7 @@ func ProvidePublisher(
|
||||
js nats.JetStreamContext,
|
||||
cfg *config.Config,
|
||||
logger *zap.Logger,
|
||||
) (adapter.Publisher, error) {
|
||||
) (port.Publisher, error) {
|
||||
return &Publisher{
|
||||
js: js,
|
||||
cfg: cfg,
|
||||
@@ -51,7 +51,7 @@ func (p *Publisher) Publish(message interface{}) error {
|
||||
jsMsg.Data = messageBytes
|
||||
|
||||
switch typed := message.(type) {
|
||||
case *model.ParsedTelegram:
|
||||
case *dto.ParsedTelegram:
|
||||
if typed != nil && typed.Uuid != "" {
|
||||
jsMsg.Header.Set("Nats-Msg-Id", typed.Uuid)
|
||||
} else {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"caatsm/internal/adapter"
|
||||
"caatsm/internal/adapter/mapper"
|
||||
"caatsm/internal/model"
|
||||
obsmetrics "caatsm/internal/observability/metrics"
|
||||
"caatsm/internal/adapter/dto"
|
||||
"caatsm/internal/port"
|
||||
obsmetrics "caatsm/internal/infra/metrics"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -19,7 +19,7 @@ import (
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// Repository implements the adapter.Repository interface using PostgreSQL
|
||||
// Repository implements the port.Repository interface using PostgreSQL
|
||||
type Repository struct {
|
||||
pool *pgxpool.Pool
|
||||
mapper *mapper.TelegramMapper
|
||||
@@ -27,7 +27,7 @@ type Repository struct {
|
||||
}
|
||||
|
||||
// ProvideRepository creates a PostgreSQL repository
|
||||
func ProvideRepository(pool *pgxpool.Pool, logger *zap.Logger) (adapter.Repository, error) {
|
||||
func ProvideRepository(pool *pgxpool.Pool, logger *zap.Logger) (port.Repository, error) {
|
||||
return &Repository{
|
||||
pool: pool,
|
||||
mapper: mapper.NewTelegramMapper(),
|
||||
@@ -36,7 +36,7 @@ func ProvideRepository(pool *pgxpool.Pool, logger *zap.Logger) (adapter.Reposito
|
||||
}
|
||||
|
||||
// InsertOne inserts a single telegram message
|
||||
func (r *Repository) InsertOne(ctx context.Context, msg *model.ParsedTelegram) error {
|
||||
func (r *Repository) InsertOne(ctx context.Context, msg *dto.ParsedTelegram) error {
|
||||
ctx, span := otel.Tracer("caatsm/postgres").Start(ctx, "Repository.InsertOne")
|
||||
defer span.End()
|
||||
span.SetAttributes(attribute.String("db.table", "aviation.telegrams"))
|
||||
@@ -114,7 +114,7 @@ func (r *Repository) InsertOne(ctx context.Context, msg *model.ParsedTelegram) e
|
||||
}
|
||||
|
||||
// InsertBatch inserts multiple telegram messages in a batch using CopyFrom
|
||||
func (r *Repository) InsertBatch(ctx context.Context, msgs []*model.ParsedTelegram) error {
|
||||
func (r *Repository) InsertBatch(ctx context.Context, msgs []*dto.ParsedTelegram) error {
|
||||
ctx, span := otel.Tracer("caatsm/postgres").Start(ctx, "Repository.InsertBatch")
|
||||
defer span.End()
|
||||
span.SetAttributes(attribute.String("db.table", "aviation.telegrams"))
|
||||
@@ -169,7 +169,7 @@ func (r *Repository) InsertBatch(ctx context.Context, msgs []*model.ParsedTelegr
|
||||
}
|
||||
|
||||
// InsertRaw inserts a failed telegram into aviation.telegrams_raw for post-processing.
|
||||
func (r *Repository) InsertRaw(ctx context.Context, msg *model.ParsedTelegram) error {
|
||||
func (r *Repository) InsertRaw(ctx context.Context, msg *dto.ParsedTelegram) error {
|
||||
ctx, span := otel.Tracer("caatsm/postgres").Start(ctx, "Repository.InsertRaw")
|
||||
defer span.End()
|
||||
span.SetAttributes(attribute.String("db.table", "aviation.telegrams_raw"))
|
||||
|
||||
+2
-2
@@ -2,7 +2,7 @@ package telemetry
|
||||
|
||||
import (
|
||||
"caatsm/internal/infra/config"
|
||||
obsmetrics "caatsm/internal/observability/metrics"
|
||||
obsmetrics "caatsm/internal/infra/metrics"
|
||||
"context"
|
||||
"time"
|
||||
|
||||
@@ -168,7 +168,7 @@ func (c *compositeRecorder) RecordJSAPICall(operation string) {
|
||||
}
|
||||
|
||||
// promRecorder delegates to the Prometheus metrics helpers in the
|
||||
// internal/observability/metrics package.
|
||||
// internal/infra/metrics package.
|
||||
type promRecorder struct{}
|
||||
|
||||
func newPromRecorder() Recorder {
|
||||
@@ -1,4 +1,4 @@
|
||||
package adapter
|
||||
package port
|
||||
|
||||
// Publisher defines the interface for publishing parsed messages
|
||||
type Publisher interface {
|
||||
@@ -1,19 +1,19 @@
|
||||
package adapter
|
||||
package port
|
||||
|
||||
import (
|
||||
"context"
|
||||
"caatsm/internal/model"
|
||||
"caatsm/internal/adapter/dto"
|
||||
)
|
||||
|
||||
// Repository defines the interface for message persistence
|
||||
type Repository interface {
|
||||
// InsertOne inserts a single telegram message
|
||||
InsertOne(ctx context.Context, msg *model.ParsedTelegram) error
|
||||
InsertOne(ctx context.Context, msg *dto.ParsedTelegram) error
|
||||
|
||||
// InsertBatch inserts multiple telegram messages in a batch
|
||||
InsertBatch(ctx context.Context, msgs []*model.ParsedTelegram) error
|
||||
InsertBatch(ctx context.Context, msgs []*dto.ParsedTelegram) error
|
||||
|
||||
// InsertRaw captures an unparsed or failed telegram for later analysis.
|
||||
InsertRaw(ctx context.Context, msg *model.ParsedTelegram) error
|
||||
InsertRaw(ctx context.Context, msg *dto.ParsedTelegram) error
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
mutation newMessage($object: aviation_telegrams_insert_input!) {
|
||||
insert_aviation_telegrams_one(object: $object) {
|
||||
message_id
|
||||
uuid
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user