Potrzebuję zaprojektować fragment systemu, gdzie użytkownikowi mogą być przypisywane uprawnienia na poziomie każdego pola modelu (brak uprawnień, uprawnienie do odczytu, uprawnienie do edycji).
Obiekt, do którego uprawnienia będą przypisywane posiada podobiekty. Uprawnienie może być przypisane do całego obiektu/podobiektu albo do jego konkretnych pól.
Przykładowo:
public class Case
{
public string Id { get; set; }
public string Status { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string[] Tags { get; set; }
public Attachment[] Attachments { get; set; }
}
public class Attachment
{
public string Id { get; set; }
public string Name { get; set; }
public string ContentUrl { get; set; }
}
I tak się zastanawiam jak to sensownie przechowywać w bazie żeby było jako tako elastyczne. Trochę boję się też sytuacji, gdzie refaktor modelu - chociażby prosta zmiana nazwy pola - będzie wymagał update'u wszystkich do tej pory przypisanych uprawnień - bo nagle się okaże że nie mam już pola Title
, tylko Name
, ale nie mam pomysłu jak mógłbym tego uniknąć.
Samo przechowywanie uprawnień mogłoby wyglądać jakoś tak:
public class Permission
{
public PermissionType PermissionType { get; set; } // read, edit itd.
public string Field { get; set; }
}
Gdzie jako Field
przechowywałbym wyrażenie JSONPath, a użytkownik do danej sprawy miałby przypisany zbiór takich uprawnień.
Co o tym sądzicie? Jak byście to zrobili?
//Edit:
Chociaż jak teraz myślę, to z JSONPath byłaby jazda po stronie backendu przy określaniu czy użytkownik może edytować/widzieć dane pole. Bo przy uprawnieniu mógłbym sobie trzymać path w postaci $.attachments[?(@.id=="111-222-333")].name
, ale w drugą stronę to już nie takie proste, żeby określić czy użytkownik może edytować pole name w danym załączniku :D