Sto scrivendo un programma con la seguente modalità concettuale.
A User can apply to become an employee, which places their account in a Pending state. They can then be Approved or Rejected. The only person who can put an account in the Pending state is the user themselves.
An Administrator can move users to and between the Approved and Rejected states (they are notified whenever a user enters the Pending state). They can also promote the account to become an Supervisor (I), Supervisor (II), or Administrator.
All Supervisors have the privileges of an Approved user in relation to their own account (e.g. schedule a vacation). They also have additional privileges (e.g. view any employee's phone number). No class of Supervisors necessarily has all the privileges of any other Supervisor class. A user can be more than one type of Supervisor at once.
Administrators have the privileges of Approved users in relation to their own account, as well as he privileges of all types of Supervisors.
Tuttavia, ho difficoltà a trovare un buon modo per rappresentarlo. In particolare, la linea in grassetto significa che non ha senso utilizzare solo un singolo user_status
enum.
Poiché desidero anche la promozione all'accesso da supervisore / amministratore dallo stato di dipendente regolare per richiedere la nuova autenticazione per l'amministratore, sembra opportuno distinguere (Nessuno) / In attesa / Approvato / Rifiutato (che sono intrinsecamente mutuamente esclusivi) da lo stato Supervisore / Amministratore.
La cosa migliore che ho inventato finora è essenzialmente qualcosa del seguente:
public class Employee {
// user id, name, etc.
ArrayList<EmployeeRole> roles;
EmployeeStatus status;
}
public enum EmployeeRole {
Employee, SupervisorI, SupervisorII, ..., Administrator
}
public enum EmployeeStatus {
None, Pending, Approved, Rejected
}
Tuttavia, questo non rappresenta bene il modello dei privilegi (in modo tale che non sono sicuro di quale possa essere l'aspetto di un progetto compatibile). Qualche suggerimento per una soluzione migliore?