chore: modify event structure
This commit is contained in:
@@ -19,34 +19,11 @@ type CompanyPrivileges struct {
|
||||
Supplier bool `json:"supplier"`
|
||||
}
|
||||
|
||||
// PrivilegeAdded is the event sent when a new privilege is added
|
||||
type PrivilegeAdded struct {
|
||||
Email string `json:"email"`
|
||||
CompanyID string `json:"companyId"`
|
||||
Name string `json:"name"`
|
||||
RegistrationNumber string `json:"registrationNumber"`
|
||||
Admin bool `json:"admin"`
|
||||
Company bool `json:"company"`
|
||||
Consumer bool `json:"consumer"`
|
||||
Time bool `json:"time"`
|
||||
Invoicing bool `json:"invoicing"`
|
||||
Accounting bool `json:"accounting"`
|
||||
Supplier bool `json:"supplier"`
|
||||
}
|
||||
|
||||
// PrivilegeRemoved is the event sent when a privilege is removed
|
||||
type PrivilegeRemoved struct {
|
||||
Email string `json:"email"`
|
||||
CompanyID string `json:"companyId"`
|
||||
Name string `json:"name"`
|
||||
RegistrationNumber string `json:"registrationNumber"`
|
||||
}
|
||||
|
||||
// PrivilegeHandler processes PrivilegeAdded-events and fetches the initial set of privileges from an authz-service
|
||||
type PrivilegeHandler struct {
|
||||
client *http.Client
|
||||
baseURL string
|
||||
privileges map[string]map[string]CompanyPrivileges
|
||||
privileges map[string]map[string]*CompanyPrivileges
|
||||
}
|
||||
|
||||
// OptsFunc is used to configure the PrivilegeHandler
|
||||
@@ -64,7 +41,7 @@ func New(opts ...OptsFunc) *PrivilegeHandler {
|
||||
handler := &PrivilegeHandler{
|
||||
client: &http.Client{},
|
||||
baseURL: "http://authz-service",
|
||||
privileges: map[string]map[string]CompanyPrivileges{},
|
||||
privileges: map[string]map[string]*CompanyPrivileges{},
|
||||
}
|
||||
for _, opt := range opts {
|
||||
opt(handler)
|
||||
@@ -94,11 +71,25 @@ func (h *PrivilegeHandler) Fetch() error {
|
||||
// Process privilege-related events and update the internal state
|
||||
func (h *PrivilegeHandler) Process(msg interface{}) bool {
|
||||
switch ev := msg.(type) {
|
||||
case *UserAdded:
|
||||
if priv, exists := h.privileges[ev.Email]; exists {
|
||||
priv[ev.CompanyID] = &CompanyPrivileges{}
|
||||
} else {
|
||||
h.privileges[ev.Email] = map[string]*CompanyPrivileges{
|
||||
ev.CompanyID: {},
|
||||
}
|
||||
}
|
||||
return true
|
||||
case *UserRemoved:
|
||||
if priv, exists := h.privileges[ev.Email]; exists {
|
||||
delete(priv, ev.CompanyID)
|
||||
}
|
||||
return true
|
||||
case *PrivilegeAdded:
|
||||
h.setPrivileges(ev)
|
||||
h.setPrivileges(ev.Email, ev.CompanyID, ev.Privilege, true)
|
||||
return true
|
||||
case *PrivilegeRemoved:
|
||||
h.removePrivileges(ev)
|
||||
h.setPrivileges(ev.Email, ev.CompanyID, ev.Privilege, false)
|
||||
return true
|
||||
default:
|
||||
fmt.Printf("Got unexpected message type (%s): '%+v'\n", reflect.TypeOf(msg).String(), msg)
|
||||
@@ -106,28 +97,32 @@ func (h *PrivilegeHandler) Process(msg interface{}) bool {
|
||||
}
|
||||
}
|
||||
|
||||
func (h *PrivilegeHandler) setPrivileges(ev *PrivilegeAdded) {
|
||||
if priv, exists := h.privileges[ev.Email]; exists {
|
||||
priv[ev.CompanyID] = CompanyPrivileges{
|
||||
Admin: ev.Admin,
|
||||
Company: ev.Company,
|
||||
Consumer: ev.Consumer,
|
||||
Time: ev.Time,
|
||||
Invoicing: ev.Invoicing,
|
||||
Accounting: ev.Accounting,
|
||||
Supplier: ev.Supplier,
|
||||
func (h *PrivilegeHandler) setPrivileges(email, companyId string, privilege Privilege, set bool) {
|
||||
if priv, exists := h.privileges[email]; exists {
|
||||
if c, exists := priv[companyId]; exists {
|
||||
switch privilege {
|
||||
case PrivilegeAdmin:
|
||||
c.Admin = set
|
||||
case PrivilegeCompany:
|
||||
c.Company = set
|
||||
case PrivilegeConsumer:
|
||||
c.Consumer = set
|
||||
case PrivilegeTime:
|
||||
c.Time = set
|
||||
case PrivilegeInvoicing:
|
||||
c.Invoicing = set
|
||||
case PrivilegeAccounting:
|
||||
c.Accounting = set
|
||||
case PrivilegeSupplier:
|
||||
c.Supplier = set
|
||||
}
|
||||
} else {
|
||||
priv[companyId] = &CompanyPrivileges{}
|
||||
h.setPrivileges(email, companyId, privilege, set)
|
||||
}
|
||||
} else {
|
||||
h.privileges[ev.Email] = map[string]CompanyPrivileges{
|
||||
ev.CompanyID: {},
|
||||
}
|
||||
h.setPrivileges(ev)
|
||||
}
|
||||
}
|
||||
|
||||
func (h *PrivilegeHandler) removePrivileges(ev *PrivilegeRemoved) {
|
||||
if priv, exists := h.privileges[ev.Email]; exists {
|
||||
delete(priv, ev.CompanyID)
|
||||
h.privileges[email] = map[string]*CompanyPrivileges{}
|
||||
h.setPrivileges(email, companyId, privilege, set)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,7 +131,7 @@ func (h *PrivilegeHandler) CompaniesByUser(email string, predicate func(privileg
|
||||
var result []string
|
||||
if p, exists := h.privileges[email]; exists {
|
||||
for k, v := range p {
|
||||
if predicate(v) {
|
||||
if predicate(*v) {
|
||||
result = append(result, k)
|
||||
}
|
||||
}
|
||||
@@ -148,7 +143,7 @@ func (h *PrivilegeHandler) CompaniesByUser(email string, predicate func(privileg
|
||||
func (h *PrivilegeHandler) IsAllowed(email, companyID string, predicate func(privileges CompanyPrivileges) bool) bool {
|
||||
if p, exists := h.privileges[email]; exists {
|
||||
if v, exists := p[companyID]; exists {
|
||||
return predicate(v)
|
||||
return predicate(*v)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user