2 Commits

Author SHA1 Message Date
argoyle db43357ce0 feat: add handling of removed privilege 2019-12-31 11:53:49 +01:00
argoyle 1476170f88 feat: add name and registration number to event 2019-12-08 15:46:52 +01:00
+43 -12
View File
@@ -21,15 +21,25 @@ type CompanyPrivileges struct {
// PrivilegeAdded is the event sent when a new privilege is added
type PrivilegeAdded struct {
Email string `json:"email"`
CompanyID string `json:"companyId"`
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"`
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
@@ -83,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) {
@@ -111,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
@@ -123,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
}