SMQ-2740 - Create events streams per service per action type (#2744)

Signed-off-by: Felix Gateru <felix.gateru@gmail.com>
This commit is contained in:
Felix Gateru
2025-04-02 18:14:03 +03:00
committed by GitHub
parent 7a3a55d399
commit 3931ecabdb
30 changed files with 396 additions and 273 deletions
+8 -6
View File
@@ -12,11 +12,12 @@ import (
"github.com/absmach/supermq/pkg/roles"
)
var (
const (
groupPrefix = "group."
groupCreate = groupPrefix + "create"
groupUpdate = groupPrefix + "update"
groupChangeStatus = groupPrefix + "change_status"
groupEnable = groupPrefix + "enable"
groupDisable = groupPrefix + "disable"
groupView = groupPrefix + "view"
groupList = groupPrefix + "list"
groupListUserGroups = groupPrefix + "list_user_groups"
@@ -34,7 +35,7 @@ var (
var (
_ events.Event = (*createGroupEvent)(nil)
_ events.Event = (*updateGroupEvent)(nil)
_ events.Event = (*changeStatusGroupEvent)(nil)
_ events.Event = (*changeGroupStatusEvent)(nil)
_ events.Event = (*viewGroupEvent)(nil)
_ events.Event = (*deleteGroupEvent)(nil)
_ events.Event = (*viewGroupEvent)(nil)
@@ -132,8 +133,9 @@ func (uge updateGroupEvent) Encode() (map[string]interface{}, error) {
return val, nil
}
type changeStatusGroupEvent struct {
type changeGroupStatusEvent struct {
id string
operation string
status string
updatedAt time.Time
updatedBy string
@@ -141,9 +143,9 @@ type changeStatusGroupEvent struct {
requestID string
}
func (rge changeStatusGroupEvent) Encode() (map[string]interface{}, error) {
func (rge changeGroupStatusEvent) Encode() (map[string]interface{}, error) {
return map[string]interface{}{
"operation": groupChangeStatus,
"operation": rge.operation,
"id": rge.id,
"status": rge.status,
"updated_at": rge.updatedAt,
+39 -20
View File
@@ -15,7 +15,25 @@ import (
"github.com/go-chi/chi/v5/middleware"
)
const streamID = "supermq.groups"
const (
supermqPrefix = "supermq."
createStream = supermqPrefix + groupCreate
updateStream = supermqPrefix + groupUpdate
enableStream = supermqPrefix + groupEnable
disableStream = supermqPrefix + groupDisable
viewStream = supermqPrefix + groupView
listStream = supermqPrefix + groupList
listUserGroupsStream = supermqPrefix + groupListUserGroups
removeStream = supermqPrefix + groupRemove
retrieveHierarchyStream = supermqPrefix + groupRetrieveGroupHierarchy
addParentStream = supermqPrefix + groupAddParentGroup
removeParentStream = supermqPrefix + groupRemoveParentGroup
viewParentStream = supermqPrefix + groupViewParentGroup
addChildrenStream = supermqPrefix + groupAddChildrenGroups
removeChildrenStream = supermqPrefix + groupRemoveChildrenGroups
removeAllChildrenStream = supermqPrefix + groupRemoveAllChildrenGroups
listChildrenStream = supermqPrefix + groupListChildrenGroups
)
var _ groups.Service = (*eventStore)(nil)
@@ -28,7 +46,7 @@ type eventStore struct {
// NewEventStoreMiddleware returns wrapper around clients service that sends
// events to event store.
func New(ctx context.Context, svc groups.Service, url string) (groups.Service, error) {
publisher, err := store.NewPublisher(ctx, url, streamID)
publisher, err := store.NewPublisher(ctx, url)
if err != nil {
return nil, err
}
@@ -54,7 +72,7 @@ func (es eventStore) CreateGroup(ctx context.Context, session authn.Session, gro
requestID: middleware.GetReqID(ctx),
}
if err := es.Publish(ctx, event); err != nil {
if err := es.Publish(ctx, createStream, event); err != nil {
return group, rps, err
}
@@ -73,7 +91,7 @@ func (es eventStore) UpdateGroup(ctx context.Context, session authn.Session, gro
middleware.GetReqID(ctx),
}
if err := es.Publish(ctx, event); err != nil {
if err := es.Publish(ctx, updateStream, event); err != nil {
return group, err
}
@@ -91,7 +109,7 @@ func (es eventStore) ViewGroup(ctx context.Context, session authn.Session, id st
middleware.GetReqID(ctx),
}
if err := es.Publish(ctx, event); err != nil {
if err := es.Publish(ctx, viewStream, event); err != nil {
return group, err
}
@@ -112,7 +130,7 @@ func (es eventStore) ListGroups(ctx context.Context, session authn.Session, pm g
requestID: middleware.GetReqID(ctx),
}
if err := es.Publish(ctx, event); err != nil {
if err := es.Publish(ctx, listStream, event); err != nil {
return gp, err
}
@@ -133,7 +151,7 @@ func (es eventStore) ListUserGroups(ctx context.Context, session authn.Session,
requestID: middleware.GetReqID(ctx),
}
if err := es.Publish(ctx, event); err != nil {
if err := es.Publish(ctx, listUserGroupsStream, event); err != nil {
return gp, err
}
@@ -146,7 +164,7 @@ func (es eventStore) EnableGroup(ctx context.Context, session authn.Session, id
return group, err
}
return es.changeStatus(ctx, session, group)
return es.changeStatus(ctx, session, groupEnable, enableStream, group)
}
func (es eventStore) DisableGroup(ctx context.Context, session authn.Session, id string) (groups.Group, error) {
@@ -155,12 +173,13 @@ func (es eventStore) DisableGroup(ctx context.Context, session authn.Session, id
return group, err
}
return es.changeStatus(ctx, session, group)
return es.changeStatus(ctx, session, groupDisable, disableStream, group)
}
func (es eventStore) changeStatus(ctx context.Context, session authn.Session, group groups.Group) (groups.Group, error) {
event := changeStatusGroupEvent{
func (es eventStore) changeStatus(ctx context.Context, session authn.Session, operation, stream string, group groups.Group) (groups.Group, error) {
event := changeGroupStatusEvent{
id: group.ID,
operation: operation,
updatedAt: group.UpdatedAt,
updatedBy: group.UpdatedBy,
status: group.Status.String(),
@@ -168,7 +187,7 @@ func (es eventStore) changeStatus(ctx context.Context, session authn.Session, gr
requestID: middleware.GetReqID(ctx),
}
if err := es.Publish(ctx, event); err != nil {
if err := es.Publish(ctx, stream, event); err != nil {
return group, err
}
@@ -179,7 +198,7 @@ func (es eventStore) DeleteGroup(ctx context.Context, session authn.Session, id
if err := es.svc.DeleteGroup(ctx, session, id); err != nil {
return err
}
if err := es.Publish(ctx, deleteGroupEvent{
if err := es.Publish(ctx, removeStream, deleteGroupEvent{
id: id,
Session: session,
requestID: middleware.GetReqID(ctx),
@@ -194,7 +213,7 @@ func (es eventStore) RetrieveGroupHierarchy(ctx context.Context, session authn.S
if err != nil {
return g, err
}
if err := es.Publish(ctx, retrieveGroupHierarchyEvent{id: id, Session: session, HierarchyPageMeta: hm, requestID: middleware.GetReqID(ctx)}); err != nil {
if err := es.Publish(ctx, retrieveHierarchyStream, retrieveGroupHierarchyEvent{id: id, Session: session, HierarchyPageMeta: hm, requestID: middleware.GetReqID(ctx)}); err != nil {
return g, err
}
return g, nil
@@ -204,7 +223,7 @@ func (es eventStore) AddParentGroup(ctx context.Context, session authn.Session,
if err := es.svc.AddParentGroup(ctx, session, id, parentID); err != nil {
return err
}
if err := es.Publish(ctx, addParentGroupEvent{id: id, parentID: parentID, Session: session, requestID: middleware.GetReqID(ctx)}); err != nil {
if err := es.Publish(ctx, addParentStream, addParentGroupEvent{id: id, parentID: parentID, Session: session, requestID: middleware.GetReqID(ctx)}); err != nil {
return err
}
return nil
@@ -214,7 +233,7 @@ func (es eventStore) RemoveParentGroup(ctx context.Context, session authn.Sessio
if err := es.svc.RemoveParentGroup(ctx, session, id); err != nil {
return err
}
if err := es.Publish(ctx, removeParentGroupEvent{id: id, Session: session, requestID: middleware.GetReqID(ctx)}); err != nil {
if err := es.Publish(ctx, removeParentStream, removeParentGroupEvent{id: id, Session: session, requestID: middleware.GetReqID(ctx)}); err != nil {
return err
}
return nil
@@ -224,7 +243,7 @@ func (es eventStore) AddChildrenGroups(ctx context.Context, session authn.Sessio
if err := es.svc.AddChildrenGroups(ctx, session, id, childrenGroupIDs); err != nil {
return err
}
if err := es.Publish(ctx, addChildrenGroupsEvent{id: id, Session: session, childrenIDs: childrenGroupIDs, requestID: middleware.GetReqID(ctx)}); err != nil {
if err := es.Publish(ctx, addChildrenStream, addChildrenGroupsEvent{id: id, Session: session, childrenIDs: childrenGroupIDs, requestID: middleware.GetReqID(ctx)}); err != nil {
return err
}
return nil
@@ -234,7 +253,7 @@ func (es eventStore) RemoveChildrenGroups(ctx context.Context, session authn.Ses
if err := es.svc.RemoveChildrenGroups(ctx, session, id, childrenGroupIDs); err != nil {
return err
}
if err := es.Publish(ctx, removeChildrenGroupsEvent{id: id, Session: session, childrenIDs: childrenGroupIDs, requestID: middleware.GetReqID(ctx)}); err != nil {
if err := es.Publish(ctx, removeChildrenStream, removeChildrenGroupsEvent{id: id, Session: session, childrenIDs: childrenGroupIDs, requestID: middleware.GetReqID(ctx)}); err != nil {
return err
}
@@ -245,7 +264,7 @@ func (es eventStore) RemoveAllChildrenGroups(ctx context.Context, session authn.
if err := es.svc.RemoveAllChildrenGroups(ctx, session, id); err != nil {
return err
}
if err := es.Publish(ctx, removeAllChildrenGroupsEvent{id: id, Session: session, requestID: middleware.GetReqID(ctx)}); err != nil {
if err := es.Publish(ctx, removeAllChildrenStream, removeAllChildrenGroupsEvent{id: id, Session: session, requestID: middleware.GetReqID(ctx)}); err != nil {
return err
}
return nil
@@ -256,7 +275,7 @@ func (es eventStore) ListChildrenGroups(ctx context.Context, session authn.Sessi
if err != nil {
return g, err
}
if err := es.Publish(ctx, listChildrenGroupsEvent{
if err := es.Publish(ctx, listChildrenStream, listChildrenGroupsEvent{
id: id,
domainID: session.DomainID,
startLevel: startLevel,