From ab80ba8628b2fd8d38de825171b0dfbbb2cd49c4 Mon Sep 17 00:00:00 2001 From: Timur Gordon <31495328+timurgordon@users.noreply.github.com> Date: Sun, 31 Aug 2025 15:12:14 +0200 Subject: [PATCH] fix heromodels --- .../paramsparser/params_get_kwargs_test.v | 2 +- lib/hero/herocluster/factory.v | 12 +-- lib/hero/herocluster/instruct2.md | 12 +-- lib/hero/heromodels/base.v | 90 +++++++++++-------- lib/hero/heromodels/calendar.v | 12 ++- lib/hero/heromodels/calendar_event.v | 66 +++++++------- lib/hero/heromodels/chat_group.v | 7 +- lib/hero/heromodels/chat_message.v | 5 +- lib/hero/heromodels/comment.v | 27 +++--- lib/hero/heromodels/core_methods.v | 71 +++++---------- lib/hero/heromodels/fs.v | 5 +- lib/hero/heromodels/fs_blob.v | 3 +- lib/hero/heromodels/fs_dir.v | 5 +- lib/hero/heromodels/fs_file.v | 7 +- lib/hero/heromodels/fs_symlink.v | 5 +- lib/hero/heromodels/group.v | 9 +- lib/hero/heromodels/project.v | 5 +- lib/hero/heromodels/project_issue.v | 5 +- lib/hero/heromodels/user.v | 5 +- lib/hero/heromodels/version_history.v | 4 +- 20 files changed, 175 insertions(+), 182 deletions(-) diff --git a/lib/data/paramsparser/params_get_kwargs_test.v b/lib/data/paramsparser/params_get_kwargs_test.v index ac881796..5a8ac5f1 100644 --- a/lib/data/paramsparser/params_get_kwargs_test.v +++ b/lib/data/paramsparser/params_get_kwargs_test.v @@ -175,7 +175,7 @@ fn test_get_u64_default() { assert params.get_u64_default('key3', 17)! == 17 } -fn test_get_u32() { +fn test_get_u32()! { text := ' key1: val1 key2: 19 diff --git a/lib/hero/herocluster/factory.v b/lib/hero/herocluster/factory.v index 2349d638..d2319dad 100644 --- a/lib/hero/herocluster/factory.v +++ b/lib/hero/herocluster/factory.v @@ -87,7 +87,7 @@ fn (mut e Election) vote_for(candidate string) { // Report node health status fn (mut e Election) report_node_health(target_id string, status string) { - now := time.now().unix_time() + now := time.now().unix() msg := '${target_id}:${status}:${now}' sig_hex := e.keys.sign(msg) @@ -111,7 +111,7 @@ fn (mut e Election) report_node_health(target_id string, status string) { // Collect health reports and check for consensus on unavailable nodes fn (mut e Election) check_node_availability() { - now := time.now().unix_time() + now := time.now().unix() mut unavailable_reports := map[string]map[string]i64{} // target_id -> reporter_id -> timestamp for mut c in e.clients { @@ -179,13 +179,13 @@ fn (mut e Election) promote_buffer_node(failed_node_id string) { for mut c in e.clients { k := node_status_key(buffer_id) c.hset(k, 'status', 'active') or {} - c.hset(k, 'promoted_at', time.now().unix_time().str()) or {} + c.hset(k, 'promoted_at', time.now().unix().str()) or {} c.hset(k, 'replaced_node', failed_node_id) or {} // Mark failed node as unavailable failed_k := node_status_key(failed_node_id) c.hset(failed_k, 'status', 'unavailable') or {} - c.hset(failed_k, 'failed_at', time.now().unix_time().str()) or {} + c.hset(failed_k, 'failed_at', time.now().unix().str()) or {} } println('[${e.self.id}] Promoted buffer node $buffer_id to replace failed node $failed_node_id') @@ -264,7 +264,7 @@ fn (mut e Election) health_monitor_loop() { heartbeat_key := 'heartbeat:${node_id}' val := c.get(heartbeat_key) or { continue } last_heartbeat := val.i64() - if (time.now().unix_time() - last_heartbeat) < 60 { // 60 seconds threshold + if (time.now().unix() - last_heartbeat) < 60 { // 60 seconds threshold is_available = true break } @@ -286,7 +286,7 @@ fn (mut e Election) health_monitor_loop() { fn (mut e Election) heartbeat_loop() { for { // Update own heartbeat - now := time.now().unix_time() + now := time.now().unix() for mut c in e.clients { heartbeat_key := 'heartbeat:${e.self.id}' c.set(heartbeat_key, now.str()) or {} diff --git a/lib/hero/herocluster/instruct2.md b/lib/hero/herocluster/instruct2.md index 9ed6f3e0..e354fa1c 100644 --- a/lib/hero/herocluster/instruct2.md +++ b/lib/hero/herocluster/instruct2.md @@ -101,7 +101,7 @@ fn (mut e Election) vote_for(candidate string) { // Report node health status fn (mut e Election) report_node_health(target_id string, status string) { - now := time.now().unix_time() + now := time.now().unix() msg := '${target_id}:${status}:${now}' sig_hex := e.keys.sign(msg) @@ -125,7 +125,7 @@ fn (mut e Election) report_node_health(target_id string, status string) { // Collect health reports and check for consensus on unavailable nodes fn (mut e Election) check_node_availability() { - now := time.now().unix_time() + now := time.now().unix() mut unavailable_reports := map[string]map[string]i64{} // target_id -> reporter_id -> timestamp for mut c in e.clients { @@ -193,13 +193,13 @@ fn (mut e Election) promote_buffer_node(failed_node_id string) { for mut c in e.clients { k := node_status_key(buffer_id) c.hset(k, 'status', 'active') or {} - c.hset(k, 'promoted_at', time.now().unix_time().str()) or {} + c.hset(k, 'promoted_at', time.now().unix().str()) or {} c.hset(k, 'replaced_node', failed_node_id) or {} // Mark failed node as unavailable failed_k := node_status_key(failed_node_id) c.hset(failed_k, 'status', 'unavailable') or {} - c.hset(failed_k, 'failed_at', time.now().unix_time().str()) or {} + c.hset(failed_k, 'failed_at', time.now().unix().str()) or {} } println('[${e.self.id}] Promoted buffer node $buffer_id to replace failed node $failed_node_id') @@ -278,7 +278,7 @@ fn (mut e Election) health_monitor_loop() { heartbeat_key := 'heartbeat:${node_id}' val := c.get(heartbeat_key) or { continue } last_heartbeat := val.i64() - if (time.now().unix_time() - last_heartbeat) < 60 { // 60 seconds threshold + if (time.now().unix() - last_heartbeat) < 60 { // 60 seconds threshold is_available = true break } @@ -300,7 +300,7 @@ fn (mut e Election) health_monitor_loop() { fn (mut e Election) heartbeat_loop() { for { // Update own heartbeat - now := time.now().unix_time() + now := time.now().unix() for mut c in e.clients { heartbeat_key := 'heartbeat:${e.self.id}' c.set(heartbeat_key, now.str()) or {} diff --git a/lib/hero/heromodels/base.v b/lib/hero/heromodels/base.v index f2c42e78..4b43eb17 100644 --- a/lib/hero/heromodels/base.v +++ b/lib/hero/heromodels/base.v @@ -1,12 +1,9 @@ module heromodels import crypto.md5 -import json import freeflowuniverse.herolib.core.redisclient -import freeflowuniverse.herolib.data.encoder - - +import freeflowuniverse.herolib.data.ourtime // Group represents a collection of users with roles and permissions @[heap] @@ -21,11 +18,9 @@ pub mut: tags u32 //when we set/get we always do as []string but this can then be sorted and md5ed this gies the unique id of tags comments []u32 } - - @[heap] -pub struct SecurityPolicy {å +pub struct SecurityPolicy { pub mut: id u32 read []u32 //links to users & groups @@ -58,44 +53,63 @@ pub mut: comments []CommentArg } +//make it easy to get a base object +pub fn new_base(args BaseArgs) !Base { + mut redis := redisclient.core_get()! + + commentids:=comment_multiset(args.comments)! + tags:=tags2id(args.tags)! + + return Base { + id: args.id or { 0 } + name: args.name + description: args.description + created_at: ourtime.now().unix() + updated_at: ourtime.now().unix() + securitypolicy: args.securitypolicy or { 0 } + tags: tags + comments: commentids + } +} pub fn tags2id(tags []string) !u32 { - mut myid:=0 - if tags.len>0{ - mytags:=tags.map(it.to_lower_ascii().trim_space()).sort().join(",") - mymd5:=crypto.hexhash(mytags) - tags:=redis.hget("db:tags", mymd5)! - if tags == ""{ - myid = u32(redis.incr("db:tags:id")!) - redis.hset("db:tags", mymd5, myid)! - redis.hset("db:tags", myid, mytags)! + mut redis := redisclient.core_get()! + return if tags.len>0{ + mut tags_fixed := tags.map(it.to_lower_ascii().trim_space()).filter(it != "") + tags_fixed.sort_ignore_case() + hash :=md5.hexhash(tags_fixed.join(",")) + tags_found := redis.hget("db:tags", hash)! + return if tags_found == ""{ + id := u32(redis.incr("db:tags:id")!) + redis.hset("db:tags", hash, id.str())! + redis.hset("db:tags", id.str(), tags_fixed.join(","))! + id }else{ - myid = tags.int() + tags_found.u32() } + } else { + 0 } - return myid } -pub fn comments2id(comments []CommentArg) !u32 { - mut myid:=0 - if comments.len>0{ - mycomments:=comments.map(it.to_lower_ascii().trim_space()).sort().join(",") - mymd5:=crypto.hexhash(mycomments) - comments:=redis.hget("db:comments", mymd5)! - if comments == ""{ - myid = u32(redis.incr("db:comments:id")!) - redis.hset("db:comments", mymd5, myid)! - redis.hset("db:comments", myid, mycomments)! - }else{ - myid = comments.int() - } - } - return myid +pub fn comments2ids(args []CommentArg) ![]u32 { + return args.map(comment2id(it.comment)!) } +pub fn comment2id(comment string) !u32 { + comment_fixed := comment.to_lower_ascii().trim_space() + mut redis := redisclient.core_get()! + return if comment_fixed.len > 0{ + hash := md5.hexhash(comment_fixed) + comment_found := redis.hget("db:comments", hash)! + if comment_found == ""{ + id := u32(redis.incr("db:comments:id")!) + redis.hset("db:comments", hash, id.str())! + redis.hset("db:comments", id.str(), comment_fixed)! + id + }else{ + comment_found.u32() + } + } else { 0 } +} - // Convert CommentArg array to u32 array - mut comment_ids := []u32{} - for comment in args.comments { - comment_ids << comment_set(comment)! - } diff --git a/lib/hero/heromodels/calendar.v b/lib/hero/heromodels/calendar.v index e7e6e6fc..aeae83e6 100644 --- a/lib/hero/heromodels/calendar.v +++ b/lib/hero/heromodels/calendar.v @@ -1,7 +1,5 @@ module heromodels -import crypto.blake3 -import json import freeflowuniverse.herolib.data.ourtime import time @@ -28,19 +26,19 @@ pub mut: is_public bool } -pub fn calendar_new(args CalendarArgs) Calendar { - commentids:=[]u32{} +pub fn calendar_new(args CalendarArgs) !Calendar { + mut commentids:=[]u32{} for comment in args.comments{ commentids << comment_set(comment)! } mut obj := Calendar{ - id: args.id + id: args.id or {0} // Will be set by DB? name: args.name description: args.description created_at: ourtime.now().unix() updated_at: ourtime.now().unix() - securitypolicy: args.securitypolicy - tags: args.tags + securitypolicy: args.securitypolicy or {0} + tags: tags2id(args.tags)! comments: commentids group_id: args.group_id events: args.events diff --git a/lib/hero/heromodels/calendar_event.v b/lib/hero/heromodels/calendar_event.v index 7dc22f14..b59e1a81 100644 --- a/lib/hero/heromodels/calendar_event.v +++ b/lib/hero/heromodels/calendar_event.v @@ -108,11 +108,10 @@ pub fn calendar_event_new(args CalendarEventArgs) !CalendarEvent { updated_at: ourtime.now().unix() securitypolicy: args.securitypolicy or { 0 } tags: tags_id - comments: comment_ids + comments: comments2ids(args.comments)! // CalendarEvent specific fields title: args.title - description: args.description start_time: ourtime.new(args.start_time)!.unix() end_time: ourtime.new(args.end_time)!.unix() location: args.location @@ -177,49 +176,49 @@ pub fn (mut e CalendarEvent) dump() ![]u8 { return enc.data } -pub fn calendar_event_load(data []u8) !CalendarEvent { +pub fn (ce CalendarEvent) load(data []u8) !CalendarEvent { // Create a new decoder mut dec := encoder.decoder_new(data) // Read version byte - version := dec.get_u8() + version := dec.get_u8()! if version != 1 { return error('wrong version in calendar event load') } // Decode Base fields - id := dec.get_u32() - name := dec.get_string() - description := dec.get_string() - created_at := dec.get_i64() - updated_at := dec.get_i64() - securitypolicy := dec.get_u32() - tags := dec.get_u32() - comments := dec.get_list_u32() + id := dec.get_u32()! + name := dec.get_string()! + description := dec.get_string()! + created_at := dec.get_i64()! + updated_at := dec.get_i64()! + securitypolicy := dec.get_u32()! + tags := dec.get_u32()! + comments := dec.get_list_u32()! // Decode CalendarEvent specific fields - title := dec.get_string() - description2 := dec.get_string() // Second description field - start_time := dec.get_i64() - end_time := dec.get_i64() - location := dec.get_string() - attendees := dec.get_list_u32() - fs_items := dec.get_list_u32() - calendar_id := dec.get_u32() - status := EventStatus(dec.get_u8()) - is_all_day := dec.get_bool() - is_recurring := dec.get_bool() + title := dec.get_string()! + description2 := dec.get_string()! // Second description field + start_time := dec.get_i64()! + end_time := dec.get_i64()! + location := dec.get_string()! + attendees := dec.get_list_u32()! + fs_items := dec.get_list_u32()! + calendar_id := dec.get_u32()! + status := unsafe { EventStatus(dec.get_u8()!) } + is_all_day := dec.get_bool()! + is_recurring := dec.get_bool()! // Decode recurrence array - recurrence_len := dec.get_u16() + recurrence_len := dec.get_u16()! mut recurrence := []RecurrenceRule{} for _ in 0..recurrence_len { - frequency := RecurrenceFreq(dec.get_u8()) - interval := dec.get_int() - until := dec.get_i64() - count := dec.get_int() - by_weekday := dec.get_list_int() - by_monthday := dec.get_list_int() + frequency := unsafe{RecurrenceFreq(dec.get_u8()!)} + interval := dec.get_int()! + until := dec.get_i64()! + count := dec.get_int()! + by_weekday := dec.get_list_int()! + by_monthday := dec.get_list_int()! recurrence << RecurrenceRule{ frequency: frequency @@ -231,9 +230,9 @@ pub fn calendar_event_load(data []u8) !CalendarEvent { } } - reminder_mins := dec.get_list_int() - color := dec.get_string() - timezone := dec.get_string() + reminder_mins := dec.get_list_int()! + color := dec.get_string()! + timezone := dec.get_string()! return CalendarEvent{ // Base fields @@ -248,7 +247,6 @@ pub fn calendar_event_load(data []u8) !CalendarEvent { // CalendarEvent specific fields title: title - description: description2 start_time: start_time end_time: end_time location: location diff --git a/lib/hero/heromodels/chat_group.v b/lib/hero/heromodels/chat_group.v index 83fc3a32..b0b915d9 100644 --- a/lib/hero/heromodels/chat_group.v +++ b/lib/hero/heromodels/chat_group.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -54,9 +55,9 @@ pub fn new_chat_group(name string, group_id string, chat_type ChatType) ChatGrou name: name group_id: group_id chat_type: chat_type - created_at: time.now().unix_time() - updated_at: time.now().unix_time() - last_activity: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() + last_activity: time.now().unix() } chat_group.calculate_id() return chat_group diff --git a/lib/hero/heromodels/chat_message.v b/lib/hero/heromodels/chat_message.v index a3e66bbe..b4f542f7 100644 --- a/lib/hero/heromodels/chat_message.v +++ b/lib/hero/heromodels/chat_message.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -95,8 +96,8 @@ pub fn new_chat_message(content string, chat_group_id string, sender_id string) sender_id: sender_id message_type: .text status: .sent - created_at: time.now().unix_time() - updated_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() } message.calculate_id() return message diff --git a/lib/hero/heromodels/comment.v b/lib/hero/heromodels/comment.v index 54938eb8..e9e273d0 100644 --- a/lib/hero/heromodels/comment.v +++ b/lib/hero/heromodels/comment.v @@ -1,8 +1,5 @@ module heromodels -import freeflowuniverse.herolib.core.redisclient -import json - import freeflowuniverse.herolib.core.redisclient import freeflowuniverse.herolib.data.encoder import freeflowuniverse.herolib.data.ourtime @@ -34,16 +31,16 @@ pub fn (self Comment) dump() ![]u8{ pub fn comment_load(data []u8) !Comment{ // Create a new decoder mut e := encoder.decoder_new(data) - version := e.get_u8() + version := e.get_u8()! if version != 1 { panic("wrong version in comment load") } mut comment := Comment{} - comment.id = e.get_u32() - comment.comment = e.get_string() - comment.parent = e.get_u32() - comment.updated_at = e.get_i64() - comment.author = e.get_u32() + comment.id = e.get_u32()! + comment.comment = e.get_string()! + comment.parent = e.get_u32()! + comment.updated_at = e.get_i64()! + comment.author = e.get_u32()! return comment } @@ -79,22 +76,22 @@ pub fn comment_set(args CommentArg) !u32{ mut redis := redisclient.core_get()! mut o:=comment_new(args)! myid := redis.incr("db:comments:id")! - o.id = myid + o.id = u32(myid) data := o.dump()! - redis.hset("db:comments:data", myid, data)! - return myid + redis.hset("db:comments:data", myid.str(), data.bytestr())! + return o.id } pub fn comment_exist(id u32) !bool{ mut redis := redisclient.core_get()! - return redis.hexist("db:comments:data",id)! + return redis.hexists("db:comments:data", id.str())! } pub fn comment_get(id u32) !Comment{ mut redis := redisclient.core_get()! - mut data:= redis.hget("db:comments:data",id)! + mut data:= redis.hget("db:comments:data", id.str())! if data.len>0{ - return comment_load(data)! + return comment_load(data.bytes())! }else{ return error("Can't find comment with id: ${id}") } diff --git a/lib/hero/heromodels/core_methods.v b/lib/hero/heromodels/core_methods.v index d08dcf90..01187edc 100644 --- a/lib/hero/heromodels/core_methods.v +++ b/lib/hero/heromodels/core_methods.v @@ -1,71 +1,44 @@ module heromodels -import crypto.md5 -import json - import freeflowuniverse.herolib.core.redisclient -import freeflowuniverse.herolib.data.encoder - -pub fn [T] set(obj T) !Base { - //todo: get the dump() from the obj , save the +pub fn set[T](obj T) ! { mut redis := redisclient.core_get()! - - data := obj.dump() - + id := obj.id + data := obj.dump()! redis.hset("db:${name}",id,data)! - } -pub fn [T] get(id u32) !T { - //todo: get the dump() from the obj , save the +pub fn get[T](id u32) !T { mut redis := redisclient.core_get()! - data := redis.hget("db:${name}",id)! - - obj:=$name_load(data) or { - return error("could not load ${name} from data") - } - - return obj + t := T{} + return t.load(data)! } -pub fn [T] exists(id u32) !T { - //todo: get the dump() from the obj , save the +pub fn exists[T](id u32) !bool { + name := T{}.type_name() mut redis := redisclient.core_get()! - return redis.hexists("db:${name}",id)! - - return obj } -pub fn [T] delete(id u32) !T { - //todo: get the dump() from the obj , save the +pub fn delete[T](id u32) ! { + name := T{}.type_name() mut redis := redisclient.core_get()! - - return redis.hdel("db:${name}",id)! - - return obj + redis.hdel("db:${name}", id.str())! } - +pub fn list[T]() ![]T { + mut redis := redisclient.core_get()! + ids := redis.hkeys("db:${name}")! + mut result := []T{} + for id in ids { + result << get[T](id.u32())! + } + return result +} //make it easy to get a base object -pub fn [T] new_from_base(args BaseArgs) !T { - - mut redis := redisclient.core_get()! - - commentids:=comment_multiset(args.comments)! - tags:=tags2id(args.tags)! - - return T{ - id: args.id or { 0 } - name: args.name - description: args.description - created_at: ourtime.now().unix() - updated_at: ourtime.now().unix() - securitypolicy: args.securitypolicy or { 0 } - tags: tags - comments: commentids) - } +pub fn new_from_base[T](args BaseArgs) !Base { + return T { Base: new_base(args)! } } \ No newline at end of file diff --git a/lib/hero/heromodels/fs.v b/lib/hero/heromodels/fs.v index e89497d3..7bb28212 100644 --- a/lib/hero/heromodels/fs.v +++ b/lib/hero/heromodels/fs.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -43,8 +44,8 @@ pub fn new_fs(name string, group_id string) Fs { mut fs := Fs{ name: name group_id: group_id - created_at: time.now().unix_time() - updated_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() } fs.calculate_id() return fs diff --git a/lib/hero/heromodels/fs_blob.v b/lib/hero/heromodels/fs_blob.v index b5b2ca20..3d0d9aa7 100644 --- a/lib/hero/heromodels/fs_blob.v +++ b/lib/hero/heromodels/fs_blob.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 // FsBlob represents binary data up to 1MB @@ -27,7 +28,7 @@ pub fn new_fs_blob(data []u8) !FsBlob { mut blob := FsBlob{ data: data size_bytes: data.len - created_at: time.now().unix_time() + created_at: time.now().unix() encoding: 'none' } blob.calculate_id() diff --git a/lib/hero/heromodels/fs_dir.v b/lib/hero/heromodels/fs_dir.v index 999e4d25..9ebd5218 100644 --- a/lib/hero/heromodels/fs_dir.v +++ b/lib/hero/heromodels/fs_dir.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -44,8 +45,8 @@ pub fn new_fs_dir(name string, fs_id string, parent_id string, group_id string) fs_id: fs_id parent_id: parent_id group_id: group_id - created_at: time.now().unix_time() - updated_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() } dir.calculate_id() return dir diff --git a/lib/hero/heromodels/fs_file.v b/lib/hero/heromodels/fs_file.v index 71c2ae6c..0156bdbb 100644 --- a/lib/hero/heromodels/fs_file.v +++ b/lib/hero/heromodels/fs_file.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -55,9 +56,9 @@ pub fn new_fs_file(name string, fs_id string, directories []string) FsFile { name: name fs_id: fs_id directories: directories - created_at: time.now().unix_time() - updated_at: time.now().unix_time() - accessed_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() + accessed_at: time.now().unix() } file.calculate_id() return file diff --git a/lib/hero/heromodels/fs_symlink.v b/lib/hero/heromodels/fs_symlink.v index 978cc52c..b64f073e 100644 --- a/lib/hero/heromodels/fs_symlink.v +++ b/lib/hero/heromodels/fs_symlink.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -52,8 +53,8 @@ pub fn new_fs_symlink(name string, fs_id string, parent_id string, target_id str parent_id: parent_id target_id: target_id target_type: target_type - created_at: time.now().unix_time() - updated_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() } symlink.calculate_id() return symlink diff --git a/lib/hero/heromodels/group.v b/lib/hero/heromodels/group.v index fd89e2b6..6831b5c3 100644 --- a/lib/hero/heromodels/group.v +++ b/lib/hero/heromodels/group.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -61,8 +62,8 @@ pub fn new_group(name string, description string) Group { mut group := Group{ name: name description: description - created_at: time.now().unix_time() - updated_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() is_public: false } group.calculate_id() @@ -73,8 +74,8 @@ pub fn (mut g Group) add_member(user_id string, role GroupRole) { g.members << GroupMember{ user_id: user_id role: role - joined_at: time.now().unix_time() + joined_at: time.now().unix() } - g.updated_at = time.now().unix_time() + g.updated_at = time.now().unix() g.calculate_id() } \ No newline at end of file diff --git a/lib/hero/heromodels/project.v b/lib/hero/heromodels/project.v index c64b450d..dae7361b 100644 --- a/lib/hero/heromodels/project.v +++ b/lib/hero/heromodels/project.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -89,8 +90,8 @@ pub fn new_project(name string, description string, group_id string) Project { description: description group_id: group_id status: .planning - created_at: time.now().unix_time() - updated_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() swimlanes: [ Swimlane{id: 'todo', name: 'To Do', order: 1, color: '#f1c40f'}, Swimlane{id: 'in_progress', name: 'In Progress', order: 2, color: '#3498db'}, diff --git a/lib/hero/heromodels/project_issue.v b/lib/hero/heromodels/project_issue.v index eb9a90e0..cb615eb7 100644 --- a/lib/hero/heromodels/project_issue.v +++ b/lib/hero/heromodels/project_issue.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -107,8 +108,8 @@ pub fn new_project_issue(title string, project_id string, reporter string, issue priority: .medium status: .open swimlane_id: 'todo' - created_at: time.now().unix_time() - updated_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() } issue.calculate_id() return issue diff --git a/lib/hero/heromodels/user.v b/lib/hero/heromodels/user.v index fe877c24..eafa6b49 100644 --- a/lib/hero/heromodels/user.v +++ b/lib/hero/heromodels/user.v @@ -1,5 +1,6 @@ module heromodels +import time import crypto.blake3 import json @@ -58,8 +59,8 @@ pub fn new_user(name string, email string) User { mut user := User{ name: name email: email - created_at: time.now().unix_time() - updated_at: time.now().unix_time() + created_at: time.now().unix() + updated_at: time.now().unix() status: .active } user.calculate_id() diff --git a/lib/hero/heromodels/version_history.v b/lib/hero/heromodels/version_history.v index 8ca99193..7c8b5ad1 100644 --- a/lib/hero/heromodels/version_history.v +++ b/lib/hero/heromodels/version_history.v @@ -1,5 +1,7 @@ module heromodels +import time + // VersionHistory tracks the evolution of objects by their blake192 IDs @[heap] pub struct VersionHistory { @@ -28,7 +30,7 @@ pub fn new_version_history(current_id string, previous_id string, object_type st object_type: object_type change_type: change_type changed_by: changed_by - changed_at: time.now().unix_time() + changed_at: time.now().unix() } }