diff --git a/client.go b/client.go index 1901c13..93c5dad 100644 --- a/client.go +++ b/client.go @@ -34,6 +34,14 @@ type PrivilegeAdded struct { 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 @@ -85,13 +93,17 @@ func (h *PrivilegeHandler) Fetch() error { // Process privilege-related events and update the internal state func (h *PrivilegeHandler) Process(msg interface{}) bool { - if ev, ok := msg.(*PrivilegeAdded); ok { + switch ev := msg.(type) { + case *PrivilegeAdded: h.setPrivileges(ev) return true - } else { + case *PrivilegeRemoved: + h.removePrivileges(ev) + return true + default: fmt.Printf("Got unexpected message type (%s): '%+v'\n", reflect.TypeOf(msg).String(), msg) + return false } - return false } func (h *PrivilegeHandler) setPrivileges(ev *PrivilegeAdded) { @@ -113,6 +125,12 @@ func (h *PrivilegeHandler) setPrivileges(ev *PrivilegeAdded) { } } +func (h *PrivilegeHandler) removePrivileges(ev *PrivilegeRemoved) { + if priv, exists := h.privileges[ev.Email]; exists { + delete(priv, ev.CompanyID) + } +} + // CompaniesByUser return a slice of company ids matching the provided email and predicate func func (h *PrivilegeHandler) CompaniesByUser(email string, predicate func(privileges CompanyPrivileges) bool) []string { var result []string @@ -125,3 +143,14 @@ func (h *PrivilegeHandler) CompaniesByUser(email string, predicate func(privileg } return result } + +// IsAllowed return true if the provided predicate return true for the privileges matching the provided email and companyID, return false otherwise +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 false +}