1
0
mirror of https://github.com/mainflux/mainflux.git synced 2025-04-26 13:48:53 +08:00
b1ackd0t 23a665b54a
MF-1510 - Add Event Sourcing To Users Service (#1835)
* Add Event Sourcing on Users Service

Signed-off-by: rodneyosodo <blackd0t@protonmail.com>

* Modify Events Sourced From Things Service

Signed-off-by: rodneyosodo <blackd0t@protonmail.com>

* Rename Cache

Signed-off-by: rodneyosodo <blackd0t@protonmail.com>

* Remove SharedBy From Events

Signed-off-by: rodneyosodo <blackd0t@protonmail.com>

* Use Combined Publisher

Signed-off-by: rodneyosodo <blackd0t@protonmail.com>

* Format Docker Compose File

Signed-off-by: rodneyosodo <blackd0t@protonmail.com>

* Rename Events

Signed-off-by: rodneyosodo <blackd0t@protonmail.com>

---------

Signed-off-by: rodneyosodo <blackd0t@protonmail.com>
2023-08-02 12:09:56 +02:00

108 lines
2.2 KiB
Go

// Copyright (c) Mainflux
// SPDX-License-Identifier: Apache-2.0
package redis
import (
"fmt"
"strings"
mfredis "github.com/mainflux/mainflux/internal/clients/redis"
"github.com/mainflux/mainflux/users/policies"
)
const (
policyPrefix = "policies."
authorize = policyPrefix + "authorize"
policyAdd = policyPrefix + "add"
policyUpdate = policyPrefix + "update"
policyList = policyPrefix + "list"
policyDelete = policyPrefix + "delete"
)
var (
_ mfredis.Event = (*policyEvent)(nil)
_ mfredis.Event = (*authorizeEvent)(nil)
_ mfredis.Event = (*listPoliciesEvent)(nil)
)
type policyEvent struct {
policies.Policy
operation string
}
func (pe policyEvent) Encode() (map[string]interface{}, error) {
val := map[string]interface{}{
"operation": pe.operation,
}
if pe.OwnerID != "" {
val["owner_id"] = pe.OwnerID
}
if pe.Subject != "" {
val["subject"] = pe.Subject
}
if pe.Object != "" {
val["object"] = pe.Object
}
if len(pe.Actions) > 0 {
actions := fmt.Sprintf("[%s]", strings.Join(pe.Actions, ","))
val["actions"] = actions
}
if !pe.CreatedAt.IsZero() {
val["created_at"] = pe.CreatedAt
}
if !pe.UpdatedAt.IsZero() {
val["updated_at"] = pe.UpdatedAt
}
if pe.UpdatedBy != "" {
val["updated_by"] = pe.UpdatedBy
}
return val, nil
}
type authorizeEvent struct {
policies.AccessRequest
}
func (ae authorizeEvent) Encode() (map[string]interface{}, error) {
// We don't want to send the key over the stream, so we don't send the subject.
val := map[string]interface{}{
"operation": authorize,
"entity_type": ae.Entity,
}
if ae.Object != "" {
val["object"] = ae.Object
}
if ae.Action != "" {
val["action"] = ae.Action
}
return val, nil
}
type listPoliciesEvent struct {
policies.Page
}
func (lpe listPoliciesEvent) Encode() (map[string]interface{}, error) {
val := map[string]interface{}{
"operation": policyList,
"total": lpe.Total,
"limit": lpe.Limit,
"offset": lpe.Offset,
}
if lpe.OwnerID != "" {
val["owner_id"] = lpe.OwnerID
}
if lpe.Subject != "" {
val["subject"] = lpe.Subject
}
if lpe.Object != "" {
val["object"] = lpe.Object
}
if lpe.Action != "" {
val["action"] = lpe.Action
}
return val, nil
}