using Invercargill; using Invercargill.DataStructures; using Json; namespace Spry.Users { public class User : GLib.Object { // Identity public string id { get; set; } public string username { get; set; } public string email { get; set; } public string password_hash { get; set; } // Metadata public DateTime created_at { get; set; } public DateTime? updated_at { get; set; } // Permissions - stored as JSON array of strings public Vector permissions { get; set; default = new Vector(); } // Application-specific data - stored as JSON object public Dictionary app_data { get; set; default = new Dictionary(); } public User() { id = ""; username = ""; email = ""; password_hash = ""; created_at = new DateTime.now_utc(); } public static User from_json(Json.Object obj) { var user = new User(); user.id = obj.get_string_member("id"); user.username = obj.get_string_member("username"); user.email = obj.get_string_member("email"); user.password_hash = obj.get_string_member("password_hash"); // created_at if (obj.has_member("created_at")) { user.created_at = new DateTime.from_iso8601( obj.get_string_member("created_at"), new TimeZone.utc() ); } // updated_at (optional) if (obj.has_member("updated_at") && !obj.get_null_member("updated_at")) { user.updated_at = new DateTime.from_iso8601( obj.get_string_member("updated_at"), new TimeZone.utc() ); } // permissions (array of strings) if (obj.has_member("permissions")) { var perms_array = obj.get_array_member("permissions"); foreach (var perm in perms_array.get_elements()) { user.permissions.add(perm.get_string()); } } // app_data (object with string values) if (obj.has_member("app_data") && !obj.get_null_member("app_data")) { var app_data_obj = obj.get_object_member("app_data"); foreach (var key in app_data_obj.get_members()) { var value = app_data_obj.get_string_member(key); user.app_data.set(key, value); } } return user; } public Json.Object to_json() { var obj = new Json.Object(); obj.set_string_member("id", id); obj.set_string_member("username", username); obj.set_string_member("email", email); obj.set_string_member("password_hash", password_hash); obj.set_string_member("created_at", created_at.format_iso8601()); // updated_at (optional) if (updated_at != null) { obj.set_string_member("updated_at", ((!)updated_at).format_iso8601()); } else { obj.set_null_member("updated_at"); } // permissions array var perms_array = new Json.Array(); foreach (var perm in permissions) { perms_array.add_string_element(perm); } obj.set_array_member("permissions", perms_array); // app_data object var app_data_obj = new Json.Object(); var iter = app_data.iterator(); while (iter.next()) { var pair = iter.get(); app_data_obj.set_string_member(pair.key, pair.value); } obj.set_object_member("app_data", app_data_obj); return obj; } } }