| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 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<string> permissions { get; set; default = new Vector<string>(); }
- // Application-specific data - stored as JSON object
- public Dictionary<string, string> app_data { get; set; default = new Dictionary<string, string>(); }
- 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;
- }
- }
- }
|