This commit is contained in:
2025-09-14 14:00:21 +02:00
parent 5b58fa9f8b
commit 9ed01e86ba
9 changed files with 2558 additions and 0 deletions

View File

@@ -24,5 +24,40 @@ pub fn start(args ServerArgs) ! {
openrpc_handler.register_procedure_handle('calendar_delete', calendar_delete)
openrpc_handler.register_procedure_handle('calendar_list', calendar_list)
openrpc_handler.register_procedure_handle('calendar_event_get', calendar_event_get)
openrpc_handler.register_procedure_handle('calendar_event_set', calendar_event_set)
openrpc_handler.register_procedure_handle('calendar_event_delete', calendar_event_delete)
openrpc_handler.register_procedure_handle('calendar_event_list', calendar_event_list)
openrpc_handler.register_procedure_handle('chat_group_get', chat_group_get)
openrpc_handler.register_procedure_handle('chat_group_set', chat_group_set)
openrpc_handler.register_procedure_handle('chat_group_delete', chat_group_delete)
openrpc_handler.register_procedure_handle('chat_group_list', chat_group_list)
openrpc_handler.register_procedure_handle('chat_message_get', chat_message_get)
openrpc_handler.register_procedure_handle('chat_message_set', chat_message_set)
openrpc_handler.register_procedure_handle('chat_message_delete', chat_message_delete)
openrpc_handler.register_procedure_handle('chat_message_list', chat_message_list)
openrpc_handler.register_procedure_handle('group_get', group_get)
openrpc_handler.register_procedure_handle('group_set', group_set)
openrpc_handler.register_procedure_handle('group_delete', group_delete)
openrpc_handler.register_procedure_handle('group_list', group_list)
openrpc_handler.register_procedure_handle('project_issue_get', project_issue_get)
openrpc_handler.register_procedure_handle('project_issue_set', project_issue_set)
openrpc_handler.register_procedure_handle('project_issue_delete', project_issue_delete)
openrpc_handler.register_procedure_handle('project_issue_list', project_issue_list)
openrpc_handler.register_procedure_handle('project_get', project_get)
openrpc_handler.register_procedure_handle('project_set', project_set)
openrpc_handler.register_procedure_handle('project_delete', project_delete)
openrpc_handler.register_procedure_handle('project_list', project_list)
openrpc_handler.register_procedure_handle('user_get', user_get)
openrpc_handler.register_procedure_handle('user_set', user_set)
openrpc_handler.register_procedure_handle('user_delete', user_delete)
openrpc_handler.register_procedure_handle('user_list', user_list)
openrpc.start_unix_server(openrpc_handler, socket_path: args.socket_path)!
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,105 @@
module rpc
import json
import freeflowuniverse.herolib.schemas.jsonrpc { Request, Response, new_response_true, new_response_u32 }
import freeflowuniverse.herolib.hero.heromodels
import freeflowuniverse.herolib.hero.db
// CalendarEvent-specific argument structures
@[params]
pub struct CalendarEventGetArgs {
pub mut:
id u32 @[required]
}
@[params]
pub struct CalendarEventSetArgs {
pub mut:
name string
description string
title string
start_time string // use ourtime module to go from string to epoch
end_time string // use ourtime module to go from string to epoch
location string
attendees []u32 // IDs of user groups
fs_items []u32 // IDs of linked files or dirs
calendar_id u32 // Associated calendar
status heromodels.EventStatus
is_all_day bool
is_recurring bool
recurrence []heromodels.RecurrenceRule
reminder_mins []int // Minutes before event for reminders
color string // Hex color code
timezone string
securitypolicy u32
tags []string
comments []db.CommentArg
}
@[params]
pub struct CalendarEventDeleteArgs {
pub mut:
id u32 @[required]
}
pub fn calendar_event_get(request Request) !Response {
payload := jsonrpc.decode_payload[CalendarEventGetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
calendar_event := mydb.calendar_event.get(payload.id)!
return jsonrpc.new_response(request.id, json.encode(calendar_event))
}
pub fn calendar_event_set(request Request) !Response {
payload := jsonrpc.decode_payload[CalendarEventSetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mut calendar_event_obj := mydb.calendar_event.new(
name: payload.name
description: payload.description
title: payload.title
start_time: payload.start_time
end_time: payload.end_time
location: payload.location
attendees: payload.attendees
fs_items: payload.fs_items
calendar_id: payload.calendar_id
status: payload.status
is_all_day: payload.is_all_day
is_recurring: payload.is_recurring
recurrence: payload.recurrence
reminder_mins: payload.reminder_mins
color: payload.color
timezone: payload.timezone
securitypolicy: payload.securitypolicy
tags: payload.tags
comments: payload.comments
)!
id := mydb.calendar_event.set(calendar_event_obj)!
return new_response_u32(request.id, id)
}
pub fn calendar_event_delete(request Request) !Response {
payload := jsonrpc.decode_payload[CalendarEventDeleteArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mydb.calendar_event.delete(payload.id)!
return new_response_true(request.id) // return true as jsonrpc (bool)
}
pub fn calendar_event_list(request Request) !Response {
mut mydb := heromodels.new()!
calendar_events := mydb.calendar_event.list()!
return jsonrpc.new_response(request.id, json.encode(calendar_events))
}

View File

@@ -0,0 +1,83 @@
module rpc
import json
import freeflowuniverse.herolib.schemas.jsonrpc { Request, Response, new_response_true, new_response_u32 }
import freeflowuniverse.herolib.hero.heromodels
import freeflowuniverse.herolib.hero.db
// ChatGroup-specific argument structures
@[params]
pub struct ChatGroupGetArgs {
pub mut:
id u32 @[required]
}
@[params]
pub struct ChatGroupSetArgs {
pub mut:
name string
description string
chat_type heromodels.ChatType
last_activity i64
is_archived bool
securitypolicy u32
tags []string
comments []db.CommentArg
}
@[params]
pub struct ChatGroupDeleteArgs {
pub mut:
id u32 @[required]
}
pub fn chat_group_get(request Request) !Response {
payload := jsonrpc.decode_payload[ChatGroupGetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
chat_group := mydb.chat_group.get(payload.id)!
return jsonrpc.new_response(request.id, json.encode(chat_group))
}
pub fn chat_group_set(request Request) !Response {
payload := jsonrpc.decode_payload[ChatGroupSetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mut chat_group_obj := mydb.chat_group.new(
name: payload.name
description: payload.description
chat_type: payload.chat_type
last_activity: payload.last_activity
is_archived: payload.is_archived
securitypolicy: payload.securitypolicy
tags: payload.tags
comments: payload.comments
)!
id := mydb.chat_group.set(chat_group_obj)!
return new_response_u32(request.id, id)
}
pub fn chat_group_delete(request Request) !Response {
payload := jsonrpc.decode_payload[ChatGroupDeleteArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mydb.chat_group.delete(payload.id)!
return new_response_true(request.id) // return true as jsonrpc (bool)
}
pub fn chat_group_list(request Request) !Response {
mut mydb := heromodels.new()!
chat_groups := mydb.chat_group.list()!
return jsonrpc.new_response(request.id, json.encode(chat_groups))
}

View File

@@ -0,0 +1,95 @@
module rpc
import json
import freeflowuniverse.herolib.schemas.jsonrpc { Request, Response, new_response_true, new_response_u32 }
import freeflowuniverse.herolib.hero.heromodels
import freeflowuniverse.herolib.hero.db
// ChatMessage-specific argument structures
@[params]
pub struct ChatMessageGetArgs {
pub mut:
id u32 @[required]
}
@[params]
pub struct ChatMessageSetArgs {
pub mut:
name string
description string
content string
chat_group_id u32
sender_id u32
parent_messages []heromodels.MessageLink
fs_files []u32
message_type heromodels.MessageType
status heromodels.MessageStatus
reactions []heromodels.MessageReaction
mentions []u32
securitypolicy u32
tags []string
comments []db.CommentArg
}
@[params]
pub struct ChatMessageDeleteArgs {
pub mut:
id u32 @[required]
}
pub fn chat_message_get(request Request) !Response {
payload := jsonrpc.decode_payload[ChatMessageGetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
chat_message := mydb.chat_message.get(payload.id)!
return jsonrpc.new_response(request.id, json.encode(chat_message))
}
pub fn chat_message_set(request Request) !Response {
payload := jsonrpc.decode_payload[ChatMessageSetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mut chat_message_obj := mydb.chat_message.new(
name: payload.name
description: payload.description
content: payload.content
chat_group_id: payload.chat_group_id
sender_id: payload.sender_id
parent_messages: payload.parent_messages
fs_files: payload.fs_files
message_type: payload.message_type
status: payload.status
reactions: payload.reactions
mentions: payload.mentions
securitypolicy: payload.securitypolicy
tags: payload.tags
comments: payload.comments
)!
id := mydb.chat_message.set(chat_message_obj)!
return new_response_u32(request.id, id)
}
pub fn chat_message_delete(request Request) !Response {
payload := jsonrpc.decode_payload[ChatMessageDeleteArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mydb.chat_message.delete(payload.id)!
return new_response_true(request.id) // return true as jsonrpc (bool)
}
pub fn chat_message_list(request Request) !Response {
mut mydb := heromodels.new()!
chat_messages := mydb.chat_message.list()!
return jsonrpc.new_response(request.id, json.encode(chat_messages))
}

View File

@@ -0,0 +1,78 @@
module rpc
import json
import freeflowuniverse.herolib.schemas.jsonrpc { Request, Response, new_response_true, new_response_u32 }
import freeflowuniverse.herolib.hero.heromodels
// Group-specific argument structures
@[params]
pub struct GroupGetArgs {
pub mut:
id u32 @[required]
}
@[params]
pub struct GroupSetArgs {
pub mut:
name string
description string
members []heromodels.GroupMember
subgroups []u32
parent_group u32
is_public bool
}
@[params]
pub struct GroupDeleteArgs {
pub mut:
id u32 @[required]
}
pub fn group_get(request Request) !Response {
payload := jsonrpc.decode_payload[GroupGetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
group := mydb.group.get(payload.id)!
return jsonrpc.new_response(request.id, json.encode(group))
}
pub fn group_set(request Request) !Response {
payload := jsonrpc.decode_payload[GroupSetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mut group_obj := mydb.group.new(
name: payload.name
description: payload.description
members: payload.members
subgroups: payload.subgroups
parent_group: payload.parent_group
is_public: payload.is_public
)!
id := mydb.group.set(group_obj)!
return new_response_u32(request.id, id)
}
pub fn group_delete(request Request) !Response {
payload := jsonrpc.decode_payload[GroupDeleteArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mydb.group.delete(payload.id)!
return new_response_true(request.id) // return true as jsonrpc (bool)
}
pub fn group_list(request Request) !Response {
mut mydb := heromodels.new()!
groups := mydb.group.list()!
return jsonrpc.new_response(request.id, json.encode(groups))
}

View File

@@ -0,0 +1,91 @@
module rpc
import json
import freeflowuniverse.herolib.schemas.jsonrpc { Request, Response, new_response_true, new_response_u32 }
import freeflowuniverse.herolib.hero.heromodels
import freeflowuniverse.herolib.hero.db
// Project-specific argument structures
@[params]
pub struct ProjectGetArgs {
pub mut:
id u32 @[required]
}
@[params]
pub struct ProjectSetArgs {
pub mut:
name string
description string
swimlanes []heromodels.Swimlane
milestones []heromodels.Milestone
issues []string
fs_files []u32
status heromodels.ProjectStatus
start_date string // Use ourtime module to convert to epoch
end_date string // Use ourtime module to convert to epoch
securitypolicy u32
tags []string
comments []db.CommentArg
}
@[params]
pub struct ProjectDeleteArgs {
pub mut:
id u32 @[required]
}
pub fn project_get(request Request) !Response {
payload := jsonrpc.decode_payload[ProjectGetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
project := mydb.project.get(payload.id)!
return jsonrpc.new_response(request.id, json.encode(project))
}
pub fn project_set(request Request) !Response {
payload := jsonrpc.decode_payload[ProjectSetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mut project_obj := mydb.project.new(
name: payload.name
description: payload.description
swimlanes: payload.swimlanes
milestones: payload.milestones
issues: payload.issues
fs_files: payload.fs_files
status: payload.status
start_date: payload.start_date
end_date: payload.end_date
securitypolicy: payload.securitypolicy
tags: payload.tags
comments: payload.comments
)!
id := mydb.project.set(project_obj)!
return new_response_u32(request.id, id)
}
pub fn project_delete(request Request) !Response {
payload := jsonrpc.decode_payload[ProjectDeleteArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mydb.project.delete(payload.id)!
return new_response_true(request.id) // return true as jsonrpc (bool)
}
pub fn project_list(request Request) !Response {
mut mydb := heromodels.new()!
projects := mydb.project.list()!
return jsonrpc.new_response(request.id, json.encode(projects))
}

View File

@@ -0,0 +1,105 @@
module rpc
import json
import freeflowuniverse.herolib.schemas.jsonrpc { Request, Response, new_response_true, new_response_u32 }
import freeflowuniverse.herolib.hero.heromodels
import freeflowuniverse.herolib.hero.db
// ProjectIssue-specific argument structures
@[params]
pub struct ProjectIssueGetArgs {
pub mut:
id u32 @[required]
}
@[params]
pub struct ProjectIssueSetArgs {
pub mut:
name string
description string
title string
project_id u32
issue_type heromodels.IssueType
priority heromodels.IssuePriority
status heromodels.IssueStatus
swimlane string
assignees []u32
reporter u32
milestone string
deadline string // Use ourtime module to convert to epoch
estimate int
fs_files []u32
parent_id u32
children []u32
securitypolicy u32
tags []string
comments []db.CommentArg
}
@[params]
pub struct ProjectIssueDeleteArgs {
pub mut:
id u32 @[required]
}
pub fn project_issue_get(request Request) !Response {
payload := jsonrpc.decode_payload[ProjectIssueGetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
project_issue := mydb.project_issue.get(payload.id)!
return jsonrpc.new_response(request.id, json.encode(project_issue))
}
pub fn project_issue_set(request Request) !Response {
payload := jsonrpc.decode_payload[ProjectIssueSetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mut project_issue_obj := mydb.project_issue.new(
name: payload.name
description: payload.description
title: payload.title
project_id: payload.project_id
issue_type: payload.issue_type
priority: payload.priority
status: payload.status
swimlane: payload.swimlane
assignees: payload.assignees
reporter: payload.reporter
milestone: payload.milestone
deadline: payload.deadline
estimate: payload.estimate
fs_files: payload.fs_files
parent_id: payload.parent_id
children: payload.children
securitypolicy: payload.securitypolicy
tags: payload.tags
comments: payload.comments
)!
id := mydb.project_issue.set(project_issue_obj)!
return new_response_u32(request.id, id)
}
pub fn project_issue_delete(request Request) !Response {
payload := jsonrpc.decode_payload[ProjectIssueDeleteArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mydb.project_issue.delete(payload.id)!
return new_response_true(request.id) // return true as jsonrpc (bool)
}
pub fn project_issue_list(request Request) !Response {
mut mydb := heromodels.new()!
project_issues := mydb.project_issue.list()!
return jsonrpc.new_response(request.id, json.encode(project_issues))
}

View File

@@ -0,0 +1,92 @@
module rpc
import json
import freeflowuniverse.herolib.schemas.jsonrpc { Request, Response, new_response_true, new_response_u32 }
import freeflowuniverse.herolib.hero.heromodels
// User-specific argument structures
@[params]
pub struct UserGetArgs {
pub mut:
id u32 @[required]
}
@[params]
pub struct UserSetArgs {
pub mut:
name string @[required]
description string
email string
public_key string // for encryption/signing
phone string
address string
avatar_url string
bio string
timezone string
status heromodels.UserStatus
securitypolicy u32
tags u32
comments []u32
}
@[params]
pub struct UserDeleteArgs {
pub mut:
id u32 @[required]
}
pub fn user_get(request Request) !Response {
payload := jsonrpc.decode_payload[UserGetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
user := mydb.user.get(payload.id)!
return jsonrpc.new_response(request.id, json.encode(user))
}
pub fn user_set(request Request) !Response {
payload := jsonrpc.decode_payload[UserSetArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mut user_obj := mydb.user.new(
name: payload.name
description: payload.description
email: payload.email
public_key: payload.public_key
phone: payload.phone
address: payload.address
avatar_url: payload.avatar_url
bio: payload.bio
timezone: payload.timezone
status: payload.status
securitypolicy: payload.securitypolicy
tags: payload.tags
comments: payload.comments
)!
id := mydb.user.set(user_obj)!
return new_response_u32(request.id, id)
}
pub fn user_delete(request Request) !Response {
payload := jsonrpc.decode_payload[UserDeleteArgs](request.params) or {
return jsonrpc.invalid_params
}
mut mydb := heromodels.new()!
mydb.user.delete(payload.id)!
return new_response_true(request.id) // return true as jsonrpc (bool)
}
pub fn user_list(request Request) !Response {
mut mydb := heromodels.new()!
users := mydb.user.list()!
return jsonrpc.new_response(request.id, json.encode(users))
}