Skip to content

Commit bd1482d

Browse files
zer0starsclaude
andauthored
Feature/event refactor (#246)
* feat: refactor Signal and Event to CloudEvent types with own identity Refactor Signal and Event structs to use CloudEvent wrappers, add pack/unpack for wire transport, and fix code quality issues including typos, dead code, missing struct tags, inconsistent error handling, and potential panics. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fixing lint --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent b2567fc commit bd1482d

56 files changed

Lines changed: 2494 additions & 1983 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

DEVELOPER_GUIDE.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Welcome to the Model Garage developer guide! This guide will help you understand
3434
- [Getting All Default Signals](#getting-all-default-signals)
3535
- [Signal Information Available](#signal-information-available)
3636
- [Common Usage Patterns](#common-usage-patterns)
37-
- [Getting Event Tags](#getting-event-tags)
37+
- [Getting Event Names](#getting-event-names)
3838
- [When to Import This Package](#when-to-import-this-package)
3939
- [Module-Specific Guides](#module-specific-guides)
4040
- [Additional Resources](#additional-resources)
@@ -461,20 +461,20 @@ signal.SetValue(65.5) // Sets ValueNumber
461461

462462
### Event Structure
463463

464-
The `vss.Event` struct represents vehicle events (harsh braking, collisions, etc.) and **directly corresponds to the database schema**:
464+
The `vss.Event` type is a CloudEvent type alias (`type Event = cloudevent.CloudEvent[EventData]`) representing vehicle events (harsh braking, collisions, etc.) and **directly corresponds to the database schema**:
465465

466466
```go
467-
type Event struct {
468-
Subject string // Vehicle/entity DID
469-
Source string // Integration source
470-
Producer string // Device DID
471-
CloudEventID string // CloudEvent identifier
472-
Name string // Event name (e.g., "behavior.harshBraking")
473-
Timestamp time.Time // When the event occurred
474-
DurationNs uint64 // Event duration in nanoseconds
475-
Metadata string // JSON metadata
476-
Tags []string // Event tags
467+
// EventData holds the domain-specific payload for an event.
468+
type EventData struct {
469+
Name string // Event name (e.g., "behavior.harshBraking")
470+
Timestamp time.Time // When the event occurred
471+
DurationNs uint64 // Event duration in nanoseconds
472+
Metadata string // JSON metadata
477473
}
474+
475+
// Event is a CloudEvent with EventData as the payload.
476+
// Fields from CloudEventHeader: Subject, Source, Producer, ID, Type, DataVersion, Tags
477+
type Event = cloudevent.CloudEvent[EventData]
478478
```
479479

480480
**Database Mapping**:
@@ -583,20 +583,20 @@ if containsPrivilege(signal.Privileges, "VEHICLE_ALL_TIME_LOCATION") {
583583
}
584584
```
585585

586-
#### Getting Event Tags
586+
#### Getting Event Names
587587

588-
Similarly, you can get all defined event tags:
588+
Similarly, you can get all defined event names:
589589

590590
```go
591591
import "github.com/DIMO-Network/model-garage/pkg/schema"
592592
593-
eventTags, err := schema.GetDefaultEventTags()
593+
eventNames, err := schema.GetDefaultEventNames()
594594
if err != nil {
595-
return fmt.Errorf("failed to load event tags: %w", err)
595+
return fmt.Errorf("failed to load event names: %w", err)
596596
}
597597
598-
for _, tag := range eventTags {
599-
fmt.Printf("Event: %s - %s\n", tag.Name, tag.Desc)
598+
for _, eventName := range eventNames {
599+
fmt.Printf("Event: %s - %s\n", eventName.Name, eventName.Desc)
600600
}
601601
```
602602

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.25.0
55
require (
66
github.com/99designs/gqlgen v0.17.87
77
github.com/DIMO-Network/clickhouse-infra v0.0.7
8-
github.com/DIMO-Network/cloudevent v0.2.2
8+
github.com/DIMO-Network/cloudevent v0.2.5
99
github.com/Masterminds/sprig/v3 v3.3.0
1010
github.com/ethereum/go-ethereum v1.17.1
1111
github.com/segmentio/ksuid v1.0.4

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ github.com/ClickHouse/clickhouse-go/v2 v2.43.0 h1:fUR05TrF1GyvLDa/mAQjkx7KbgwdLR
2929
github.com/ClickHouse/clickhouse-go/v2 v2.43.0/go.mod h1:o6jf7JM/zveWC/PP277BLxjHy5KjnGX/jfljhM4s34g=
3030
github.com/DIMO-Network/clickhouse-infra v0.0.7 h1:TAsjkFFKu3D5Xg6dwBcRBryjCVSlXsNjVbTwJ4UDlTg=
3131
github.com/DIMO-Network/clickhouse-infra v0.0.7/go.mod h1:XS80lhSJNWBWGgZ+m4j7++zFj1wAXfmtV2gJfhGlabQ=
32-
github.com/DIMO-Network/cloudevent v0.2.2 h1:nSVLa6AIv2I5w0X180Dbds19ttZzqtrqEJfTG8ff2AI=
33-
github.com/DIMO-Network/cloudevent v0.2.2/go.mod h1:zFG6pf7ejwC0y3//mHpISDHR/blsSz8Lew2c4ebc8Lw=
32+
github.com/DIMO-Network/cloudevent v0.2.5 h1:3s6ZKtBXHYy0ujMYBdOBF9uJAc5C+EKEF7/SToW2cJA=
33+
github.com/DIMO-Network/cloudevent v0.2.5/go.mod h1:zFG6pf7ejwC0y3//mHpISDHR/blsSz8Lew2c4ebc8Lw=
3434
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
3535
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
3636
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=

internal/generator/vehicle.tmpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ const (
99
{{- end}}
1010
)
1111

12-
// JSON names for defined event tags
12+
// JSON names for defined event names
1313
const (
14-
{{- range .EventTags}}
15-
// Tag{{ .GOName }} {{ .Desc }}
16-
Tag{{ .GOName }} = "{{ .JSONName }}"
14+
{{- range .EventNames}}
15+
// Event{{ .GOName }}Name {{ .Desc }}
16+
Event{{ .GOName }}Name = "{{ .JSONName }}"
1717
{{- end}}
18-
)
18+
)

pkg/autopi/codegen/convert_signal_status.tmpl

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
// Code generated by github.com/DIMO-Network/model-garage DO NOT EDIT.
22
package autopi
33

4+
import (
5+
"errors"
6+
"fmt"
7+
"github.com/DIMO-Network/model-garage/pkg/convert"
8+
"github.com/DIMO-Network/model-garage/pkg/vss"
9+
"github.com/tidwall/gjson"
10+
)
411

5-
// SignalsFromData converts the given JSON data to a slice of signals.
6-
func SignalsFromV2Data(originalDoc []byte, baseSignal vss.Signal, signalName string, sigResult gjson.Result) ([]vss.Signal, error) {
12+
// SignalsFromV2Data converts the given JSON data to a slice of signal data.
13+
func SignalsFromV2Data(originalDoc []byte, baseSignal vss.Signal, signalName string, sigResult gjson.Result) ([]vss.SignalData, error) {
714
valResult := sigResult.Get("value")
815
if !valResult.Exists() {
916
return nil, errors.New("value field not found")
1017
}
11-
ret := make([]vss.Signal, 0)
18+
ret := make([]vss.SignalData, 0)
1219
var retErrs error
1320
{{ $root := . }}
1421
switch signalName {
@@ -19,11 +26,10 @@ func SignalsFromV2Data(originalDoc []byte, baseSignal vss.Signal, signalName str
1926
if err != nil {
2027
retErrs = errors.Join(retErrs, fmt.Errorf("failed to convert '{{ $origInfo.Name }}': %w", err))
2128
} else {
22-
sig := vss.Signal{
23-
Subject: baseSignal.Subject,
24-
Timestamp: baseSignal.Timestamp,
25-
Source: baseSignal.Source,
26-
Name: "{{ $sig.JSONName }}",
29+
sig := vss.SignalData{
30+
Timestamp: baseSignal.Data.Timestamp,
31+
Name: "{{ $sig.JSONName }}",
32+
CloudEventID: baseSignal.CloudEventHeader.ID,
2733
}
2834
sig.SetValue(val{{ $j }})
2935
ret = append(ret, sig)

pkg/autopi/convert_signal.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ func SignalsFromV2Payload(event cloudevent.RawEvent) ([]vss.Signal, error) {
3535
}
3636
retSignals := []vss.Signal{}
3737
signalMeta := vss.Signal{
38-
Subject: event.Subject,
39-
Source: event.Source,
38+
CloudEventHeader: event.CloudEventHeader,
4039
}
40+
hdr := event.CloudEventHeader
41+
hdr.Type = cloudevent.TypeSignal
4142

4243
conversionErrors := convert.ConversionError{
4344
Subject: event.Subject,
@@ -55,13 +56,15 @@ func SignalsFromV2Payload(event cloudevent.RawEvent) ([]vss.Signal, error) {
5556
conversionErrors.Errors = append(conversionErrors.Errors, err)
5657
continue
5758
}
58-
signalMeta.Timestamp = ts
59-
sigs, err := SignalsFromV2Data(event.Data, signalMeta, originalName, sigData)
59+
signalMeta.Data.Timestamp = ts
60+
sigDatas, err := SignalsFromV2Data(event.Data, signalMeta, originalName, sigData)
6061
if err != nil {
6162
conversionErrors.Errors = append(conversionErrors.Errors, err)
6263
continue
6364
}
64-
retSignals = append(retSignals, sigs...)
65+
for _, sd := range sigDatas {
66+
retSignals = append(retSignals, vss.Signal{CloudEventHeader: hdr, Data: sd})
67+
}
6568
}
6669

6770
if len(conversionErrors.Errors) > 0 {

0 commit comments

Comments
 (0)