User.vala 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using Invercargill;
  2. using Invercargill.DataStructures;
  3. using Json;
  4. namespace Spry.Users {
  5. public class User : GLib.Object {
  6. // Identity
  7. public string id { get; set; }
  8. public string username { get; set; }
  9. public string email { get; set; }
  10. public string password_hash { get; set; }
  11. // Metadata
  12. public DateTime created_at { get; set; }
  13. public DateTime? updated_at { get; set; }
  14. // Permissions - stored as JSON array of strings
  15. public Vector<string> permissions { get; set; default = new Vector<string>(); }
  16. // Application-specific data - stored as JSON object
  17. public Dictionary<string, string> app_data { get; set; default = new Dictionary<string, string>(); }
  18. public User() {
  19. id = "";
  20. username = "";
  21. email = "";
  22. password_hash = "";
  23. created_at = new DateTime.now_utc();
  24. }
  25. public static User from_json(Json.Object obj) {
  26. var user = new User();
  27. user.id = obj.get_string_member("id");
  28. user.username = obj.get_string_member("username");
  29. user.email = obj.get_string_member("email");
  30. user.password_hash = obj.get_string_member("password_hash");
  31. // created_at
  32. if (obj.has_member("created_at")) {
  33. user.created_at = new DateTime.from_iso8601(
  34. obj.get_string_member("created_at"),
  35. new TimeZone.utc()
  36. );
  37. }
  38. // updated_at (optional)
  39. if (obj.has_member("updated_at") && !obj.get_null_member("updated_at")) {
  40. user.updated_at = new DateTime.from_iso8601(
  41. obj.get_string_member("updated_at"),
  42. new TimeZone.utc()
  43. );
  44. }
  45. // permissions (array of strings)
  46. if (obj.has_member("permissions")) {
  47. var perms_array = obj.get_array_member("permissions");
  48. foreach (var perm in perms_array.get_elements()) {
  49. user.permissions.add(perm.get_string());
  50. }
  51. }
  52. // app_data (object with string values)
  53. if (obj.has_member("app_data") && !obj.get_null_member("app_data")) {
  54. var app_data_obj = obj.get_object_member("app_data");
  55. foreach (var key in app_data_obj.get_members()) {
  56. var value = app_data_obj.get_string_member(key);
  57. user.app_data.set(key, value);
  58. }
  59. }
  60. return user;
  61. }
  62. public Json.Object to_json() {
  63. var obj = new Json.Object();
  64. obj.set_string_member("id", id);
  65. obj.set_string_member("username", username);
  66. obj.set_string_member("email", email);
  67. obj.set_string_member("password_hash", password_hash);
  68. obj.set_string_member("created_at", created_at.format_iso8601());
  69. // updated_at (optional)
  70. if (updated_at != null) {
  71. obj.set_string_member("updated_at", ((!)updated_at).format_iso8601());
  72. } else {
  73. obj.set_null_member("updated_at");
  74. }
  75. // permissions array
  76. var perms_array = new Json.Array();
  77. foreach (var perm in permissions) {
  78. perms_array.add_string_element(perm);
  79. }
  80. obj.set_array_member("permissions", perms_array);
  81. // app_data object
  82. var app_data_obj = new Json.Object();
  83. var iter = app_data.iterator();
  84. while (iter.next()) {
  85. var pair = iter.get();
  86. app_data_obj.set_string_member(pair.key, pair.value);
  87. }
  88. obj.set_object_member("app_data", app_data_obj);
  89. return obj;
  90. }
  91. }
  92. }