Session.vala 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using Invercargill.DataStructures;
  2. using Json;
  3. namespace Spry.Users {
  4. public class Session : GLib.Object {
  5. // Identity
  6. public string id { get; set; }
  7. public string user_id { get; set; }
  8. // Timing
  9. public DateTime created_at { get; set; }
  10. public DateTime expires_at { get; set; }
  11. // Optional tracking
  12. public string? ip_address { get; set; }
  13. public string? user_agent { get; set; }
  14. public Session() {
  15. id = "";
  16. user_id = "";
  17. created_at = new DateTime.now_utc();
  18. expires_at = new DateTime.now_utc();
  19. }
  20. public bool is_expired() {
  21. return expires_at.compare(new DateTime.now_utc()) <= 0;
  22. }
  23. public static Session from_json(Json.Object obj) {
  24. var session = new Session();
  25. // Required string fields - use has_member and null coalescing for safety
  26. session.id = obj.has_member("id") ? (obj.get_string_member("id") ?? "") : "";
  27. session.user_id = obj.has_member("user_id") ? (obj.get_string_member("user_id") ?? "") : "";
  28. // created_at - check member exists and value is not null/empty
  29. if (obj.has_member("created_at")) {
  30. var created_str = obj.get_string_member("created_at");
  31. if (created_str != null && created_str.length > 0) {
  32. session.created_at = new DateTime.from_iso8601(created_str, new TimeZone.utc());
  33. }
  34. }
  35. // expires_at - check member exists and value is not null/empty
  36. if (obj.has_member("expires_at")) {
  37. var expires_str = obj.get_string_member("expires_at");
  38. if (expires_str != null && expires_str.length > 0) {
  39. session.expires_at = new DateTime.from_iso8601(expires_str, new TimeZone.utc());
  40. }
  41. }
  42. // ip_address (optional) - check member exists and is not null
  43. if (obj.has_member("ip_address")) {
  44. var member = obj.get_member("ip_address");
  45. if (member != null && member.get_node_type() == Json.NodeType.VALUE) {
  46. session.ip_address = obj.get_string_member("ip_address");
  47. }
  48. }
  49. // user_agent (optional) - check member exists and is not null
  50. if (obj.has_member("user_agent")) {
  51. var member = obj.get_member("user_agent");
  52. if (member != null && member.get_node_type() == Json.NodeType.VALUE) {
  53. session.user_agent = obj.get_string_member("user_agent");
  54. }
  55. }
  56. return session;
  57. }
  58. public Json.Object to_json() {
  59. var obj = new Json.Object();
  60. // Use null coalescing to ensure we never pass null to set_string_member
  61. obj.set_string_member("id", id ?? "");
  62. obj.set_string_member("user_id", user_id ?? "");
  63. obj.set_string_member("created_at", created_at != null ? created_at.format_iso8601() : new DateTime.now_utc().format_iso8601());
  64. obj.set_string_member("expires_at", expires_at != null ? expires_at.format_iso8601() : new DateTime.now_utc().format_iso8601());
  65. // ip_address (optional)
  66. if (ip_address != null) {
  67. obj.set_string_member("ip_address", (!)ip_address);
  68. } else {
  69. obj.set_null_member("ip_address");
  70. }
  71. // user_agent (optional)
  72. if (user_agent != null) {
  73. obj.set_string_member("user_agent", (!)user_agent);
  74. } else {
  75. obj.set_null_member("user_agent");
  76. }
  77. return obj;
  78. }
  79. }
  80. }