From 9a5c2fa64306121affdb59aebc979e9a823297e7 Mon Sep 17 00:00:00 2001 From: ryan Date: Sun, 30 Aug 2026 11:23:01 +0800 Subject: [PATCH] feat(message_gateway): expose PushRegistry contract --- backend/core/contracts/push.go | 26 +++++++++ .../plugins/domain/message_gateway/plugin.go | 3 +- .../message_gateway/plugin_registry_test.go | 54 +++++++++++++++++++ .../domain/message_gateway/service/push.go | 25 +++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 backend/core/contracts/push.go create mode 100644 backend/plugins/domain/message_gateway/plugin_registry_test.go diff --git a/backend/core/contracts/push.go b/backend/core/contracts/push.go new file mode 100644 index 00000000..9769a144 --- /dev/null +++ b/backend/core/contracts/push.go @@ -0,0 +1,26 @@ +// Copyright 2026 Arctel.net +// SPDX-License-Identifier: Apache-2.0 + +// Package contracts defines unified service interfaces and DTOs for cross-plugin communication. +package contracts + +import "context" + +type PushNotificationTemplate struct { + Title string + Content string + Level string + Ext map[string]any +} + +type PushEventMeta struct { + Key string + Name string + Description string + DefaultTemplate PushNotificationTemplate +} + +type PushRegistry interface { + RegisterBuiltInEvent(meta PushEventMeta) + SyncEvents(ctx context.Context) error +} diff --git a/backend/plugins/domain/message_gateway/plugin.go b/backend/plugins/domain/message_gateway/plugin.go index 16c1b463..482a6c26 100644 --- a/backend/plugins/domain/message_gateway/plugin.go +++ b/backend/plugins/domain/message_gateway/plugin.go @@ -231,8 +231,9 @@ func (p *Plugin) Apply(ctx *core.Context) error { return nil }) - // 9. Register built-in domain events + // 9. Register built-in domain events and provide PushRegistry service.RegisterCustomEvents() + core.Provide[contracts.PushRegistry](ctx, service.PushRegistryAdapter{}) // 10. Register Settings Schemas ctx.Settings().Register(extpoints.SettingSchema{ diff --git a/backend/plugins/domain/message_gateway/plugin_registry_test.go b/backend/plugins/domain/message_gateway/plugin_registry_test.go new file mode 100644 index 00000000..57cd9205 --- /dev/null +++ b/backend/plugins/domain/message_gateway/plugin_registry_test.go @@ -0,0 +1,54 @@ +// Copyright 2026 Arctel.net +// SPDX-License-Identifier: Apache-2.0 + +package message_gateway_test + +import ( + "Wavelet/core" + "Wavelet/core/contracts" + "Wavelet/plugins/domain/message_gateway" + "Wavelet/plugins/domain/message_gateway/service" + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPushRegistry(t *testing.T) { + ctx := core.NewContext(context.Background()) + require.NoError(t, message_gateway.New().Apply(ctx)) + + registry, err := core.Inject[contracts.PushRegistry](ctx) + require.NoError(t, err) + require.NotNil(t, registry) + + const key = "test.push_registry.probe" + registry.RegisterBuiltInEvent(contracts.PushEventMeta{ + Key: key, + Name: "Push Registry Probe", + Description: "observability probe for contracts.PushRegistry", + DefaultTemplate: contracts.PushNotificationTemplate{ + Title: "Probe Title", + Content: "Probe Content", + Level: "INFO", + Ext: map[string]any{"source": "test"}, + }, + }) + + found := false + for _, ev := range service.GetBuiltInEvents() { + if ev.Key != key { + continue + } + found = true + assert.Equal(t, "Push Registry Probe", ev.Name) + assert.Equal(t, "observability probe for contracts.PushRegistry", ev.Description) + assert.Equal(t, "Probe Title", ev.DefaultTemplate.Title) + assert.Equal(t, "Probe Content", ev.DefaultTemplate.Content) + assert.Equal(t, "INFO", ev.DefaultTemplate.Level) + assert.Equal(t, map[string]any{"source": "test"}, ev.DefaultTemplate.Ext) + break + } + require.True(t, found, "registered key %q should be visible via GetBuiltInEvents", key) +} diff --git a/backend/plugins/domain/message_gateway/service/push.go b/backend/plugins/domain/message_gateway/service/push.go index e45f7bdc..0ea7081f 100644 --- a/backend/plugins/domain/message_gateway/service/push.go +++ b/backend/plugins/domain/message_gateway/service/push.go @@ -49,6 +49,31 @@ func GetBuiltInEvents() []model.EventMetadata { return out } +// PushRegistryAdapter adapts contracts.PushRegistry onto the built-in event store. +type PushRegistryAdapter struct{} + +func (PushRegistryAdapter) RegisterBuiltInEvent(meta contracts.PushEventMeta) { + RegisterBuiltInEvent(eventMetadataFromContract(meta)) +} + +func (PushRegistryAdapter) SyncEvents(ctx context.Context) error { + return SyncEvents(ctx) +} + +func eventMetadataFromContract(meta contracts.PushEventMeta) model.EventMetadata { + return model.EventMetadata{ + Key: meta.Key, + Name: meta.Name, + Description: meta.Description, + DefaultTemplate: model.NotificationMessage{ + Title: meta.DefaultTemplate.Title, + Content: meta.DefaultTemplate.Content, + Level: meta.DefaultTemplate.Level, + Ext: meta.DefaultTemplate.Ext, + }, + } +} + // SyncBuiltInEvents seeds a database row for every registered built-in event. func SyncBuiltInEvents(ctx context.Context) error { for _, meta := range GetBuiltInEvents() {