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:
windyboy
2025-11-17 11:47:23 +08:00
parent 12fda00df9
commit 204217015d
45 changed files with 252 additions and 175 deletions
@@ -1,4 +1,4 @@
package model
package dto
import (
"time"
+3 -3
View File
@@ -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)
}
+7 -7
View File
@@ -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]),
+4 -4
View File
@@ -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,4 +1,4 @@
package parsers
package parser
import (
"caatsm/internal/domain"
@@ -1,4 +1,4 @@
package parsers
package parser
import "regexp"
+2 -2
View File
@@ -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"
+11 -1
View File
@@ -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,4 +1,4 @@
package parsers
package parser
import (
"strings"
@@ -1,4 +1,4 @@
package parsers
package parser
import (
"testing"
+16 -16
View File
@@ -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
}
+22 -22
View File
@@ -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
}
+1 -1
View File
@@ -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.).
-19
View File
@@ -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"
+1 -1
View File
@@ -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"
+4 -4
View File
@@ -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,
+4 -4
View File
@@ -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 {
+8 -8
View File
@@ -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,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
}
-6
View File
@@ -1,6 +0,0 @@
mutation newMessage($object: aviation_telegrams_insert_input!) {
insert_aviation_telegrams_one(object: $object) {
message_id
uuid
}
}