From 3ecb8c11301fb0eaf85c97d8c507cd8eacb94de9 Mon Sep 17 00:00:00 2001 From: despiegk Date: Sat, 22 Nov 2025 05:36:04 +0200 Subject: [PATCH] .... --- examples/hero/heroserver/heroserver.vsh | 2 +- examples/hero/heroserver/openrpc.json | 3006 +++++++++++++++++++- examples/hero/heroserver/openrpc_back.json | 69 + lib/hero/heromodels/prd_test.v | 17 +- 4 files changed, 3021 insertions(+), 73 deletions(-) create mode 100644 examples/hero/heroserver/openrpc_back.json diff --git a/examples/hero/heroserver/heroserver.vsh b/examples/hero/heroserver/heroserver.vsh index c2ff8227..673261ec 100755 --- a/examples/hero/heroserver/heroserver.vsh +++ b/examples/hero/heroserver/heroserver.vsh @@ -5,7 +5,7 @@ import incubaid.herolib.schemas.openrpc import os // 1. Create a new server instance -mut server := heroserver.new(port: 8080, auth_enabled: false)! +mut server := heroserver.new(port: 8081, auth_enabled: false)! // 2. Create and register your OpenRPC handlers // These handlers must conform to the `openrpc.OpenRPCHandler` interface. diff --git a/examples/hero/heroserver/openrpc.json b/examples/hero/heroserver/openrpc.json index 8115d3a2..6ae8efc1 100644 --- a/examples/hero/heroserver/openrpc.json +++ b/examples/hero/heroserver/openrpc.json @@ -1,69 +1,2955 @@ { - "openrpc": "1.2.6", - "info": { - "title": "Comment Service", - "description": "A simple service for managing comments.", - "version": "1.0.0" - }, - "methods": [ - { - "name": "add_comment", - "summary": "Add a new comment", - "params": [ - { - "name": "text", - "description": "The content of the comment.", - "required": true, - "schema": { - "type": "string" - } - } - ], - "result": { - "name": "comment_id", - "description": "The ID of the newly created comment.", - "schema": { - "type": "string" - } - } + "openrpc": "1.0.0", + "info": { + "title": "Hero Models API", + "version": "1.0.0" }, - { - "name": "get_comment", - "summary": "Get a comment by ID", - "description": "Retrieves a specific comment using its unique identifier.", - "params": [ + "methods": [ { - "name": "id", - "description": "The unique identifier of the comment to retrieve.", - "required": true, - "schema": { - "type": "number", - "example": "1" - } + "name": "calendar.get", + "summary": "Get a calendar by ID", + "description": "Retrieve a calendar by ID. Returns the calendar object.", + "params": [ + { + "name": "id", + "description": "ID of calendar to fetch", + "required": true, + "schema": { + "type": "integer", + "example": 1, + "minimum": 0 + } + } + ], + "result": { + "name": "calendar", + "description": "Calendar object", + "schema": { + "$ref": "#/components/schemas/Calendar" + } + } }, { - "name": "include_metadata", - "description": "Whether to include metadata in the response.", - "required": false, - "schema": { - "type": "boolean", - "example": true - } + "name": "calendar.set", + "summary": "Create or update a calendar", + "description": "Create or update a calendar. Returns the ID of the calendar.", + "params": [ + { + "name": "calendar", + "description": "Calendar object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/Calendar" + } + }, + { + "name": "events", + "description": "Array of event IDs to add to the calendar", + "required": false, + "schema": { + "type": "array", + "example": [ + 1, + 2, + 3 + ], + "items": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "color", + "description": "Hex color code for the calendar", + "required": false, + "schema": { + "type": "string", + "example": "#FF0000" + } + }, + { + "name": "timezone", + "description": "Timezone for the calendar", + "required": false, + "schema": { + "type": "string", + "example": "UTC" + } + }, + { + "name": "is_public", + "description": "Whether the calendar is public", + "required": false, + "schema": { + "type": "boolean", + "example": true + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated calendar", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "calendar.delete", + "summary": "Delete a calendar by ID", + "description": "Delete a calendar by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of calendar to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "example": 1 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "calendar.exist", + "summary": "Check if a calendar exists by ID", + "description": "Check if a calendar exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of calendar to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "example": 1 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the calendar exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "calendar.list", + "summary": "List all calendars", + "description": "List all calendars. Returns an array of calendar objects.", + "params": [], + "result": { + "name": "calendars", + "description": "List of all calendar objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Calendar" + } + } + } + }, + { + "name": "calendar_event.get", + "summary": "Get a calendar event by ID", + "description": "Retrieve a calendar event by ID. Returns the event object.", + "params": [ + { + "name": "id", + "description": "ID of calendar event to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "example": 1 + } + } + ], + "result": { + "name": "calendar_event", + "description": "Calendar event object", + "schema": { + "$ref": "#/components/schemas/CalendarEvent" + } + } + }, + { + "name": "calendar_event.set", + "summary": "Create or update a calendar event", + "description": "Create or update a calendar event. Returns the ID of the event.", + "params": [ + { + "name": "calendar_event", + "description": "Calendar event object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/CalendarEvent" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated calendar event", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "calendar_event.delete", + "summary": "Delete a calendar event by ID", + "description": "Delete a calendar event by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of calendar event to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "example": 1 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "calendar_event.exist", + "summary": "Check if a calendar event exists by ID", + "description": "Check if a calendar event exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of calendar event to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "example": 1 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the calendar event exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "calendar_event.list", + "summary": "List all calendar events", + "description": "List all calendar events. Returns an array of event objects.", + "params": [], + "result": { + "name": "calendar_events", + "description": "List of all calendar event objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CalendarEvent" + } + } + } + }, + { + "name": "chat_group.get", + "summary": "Get a chat group by ID", + "description": "Retrieve a chat group by ID. Returns the chat group object.", + "params": [ + { + "name": "id", + "description": "ID of chat group to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "chat_group", + "description": "Chat group object", + "schema": { + "$ref": "#/components/schemas/ChatGroup" + } + } + }, + { + "name": "chat_group.set", + "summary": "Create or update a chat group", + "description": "Create or update a chat group. Returns the ID of the chat group.", + "params": [ + { + "name": "chat_group", + "description": "Chat group object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/ChatGroup" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated chat group", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "chat_group.delete", + "summary": "Delete a chat group by ID", + "description": "Delete a chat group by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of chat group to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "chat_group.exist", + "summary": "Check if a chat group exists by ID", + "description": "Check if a chat group exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of chat group to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the chat group exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "chat_group.list", + "summary": "List all chat groups", + "description": "List all chat groups. Returns an array of chat group objects.", + "params": [], + "result": { + "name": "chat_groups", + "description": "List of all chat group objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChatGroup" + } + } + } + }, + { + "name": "chat_message.get", + "summary": "Get a chat message by ID", + "description": "Retrieve a chat message by ID. Returns the message object.", + "params": [ + { + "name": "id", + "description": "ID of chat message to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "chat_message", + "description": "Chat message object", + "schema": { + "$ref": "#/components/schemas/ChatMessage" + } + } + }, + { + "name": "chat_message.set", + "summary": "Create or update a chat message", + "description": "Create or update a chat message. Returns the ID of the message.", + "params": [ + { + "name": "chat_message", + "description": "Chat message object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/ChatMessage" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated chat message", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "chat_message.delete", + "summary": "Delete a chat message by ID", + "description": "Delete a chat message by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of chat message to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "chat_message.exist", + "summary": "Check if a chat message exists by ID", + "description": "Check if a chat message exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of chat message to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the chat message exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "chat_message.list", + "summary": "List all chat messages", + "description": "List all chat messages. Returns an array of message objects.", + "params": [], + "result": { + "name": "chat_messages", + "description": "List of all chat message objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChatMessage" + } + } + } + }, + { + "name": "contact.get", + "summary": "Get a contact by ID", + "description": "Retrieve a contact by ID. Returns the contact object.", + "params": [ + { + "name": "id", + "description": "ID of contact to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "contact", + "description": "Contact object", + "schema": { + "$ref": "#/components/schemas/Contact" + } + } + }, + { + "name": "contact.set", + "summary": "Create or update a contact", + "description": "Create or update a contact. Returns the ID of the contact.", + "params": [ + { + "name": "contact", + "description": "Contact object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/Contact" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated contact", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "contact.delete", + "summary": "Delete a contact by ID", + "description": "Delete a contact by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of contact to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "contact.exist", + "summary": "Check if a contact exists by ID", + "description": "Check if a contact exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of contact to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the contact exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "contact.list", + "summary": "List all contacts", + "description": "List all contacts. Returns an array of contact objects.", + "params": [], + "result": { + "name": "contacts", + "description": "List of all contact objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Contact" + } + } + } + }, + { + "name": "group.get", + "summary": "Get a group by ID", + "description": "Retrieve a group by ID. Returns the group object.", + "params": [ + { + "name": "id", + "description": "ID of group to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "group", + "description": "Group object", + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + { + "name": "group.set", + "summary": "Create or update a group", + "description": "Create or update a group. Returns the ID of the group.", + "params": [ + { + "name": "group", + "description": "Group object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/Group" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated group", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "group.delete", + "summary": "Delete a group by ID", + "description": "Delete a group by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of group to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "group.exist", + "summary": "Check if a group exists by ID", + "description": "Check if a group exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of group to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the group exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "group.list", + "summary": "List all groups", + "description": "List all groups. Returns an array of group objects.", + "params": [], + "result": { + "name": "groups", + "description": "List of all group objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Group" + } + } + } + }, + { + "name": "message.get", + "summary": "Get a message by ID", + "description": "Retrieve a message by ID. Returns the message object.", + "params": [ + { + "name": "id", + "description": "ID of message to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "message", + "description": "Message object", + "schema": { + "$ref": "#/components/schemas/Message" + } + } + }, + { + "name": "message.set", + "summary": "Create or update a message", + "description": "Create or update a message. Returns the ID of the message.", + "params": [ + { + "name": "message", + "description": "Message object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/Message" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated message", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "message.delete", + "summary": "Delete a message by ID", + "description": "Delete a message by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of message to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "message.exist", + "summary": "Check if a message exists by ID", + "description": "Check if a message exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of message to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the message exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "message.list", + "summary": "List all messages", + "description": "List all messages. Returns an array of message objects.", + "params": [], + "result": { + "name": "messages", + "description": "List of all message objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Message" + } + } + } + }, + { + "name": "planning.get", + "summary": "Get a planning by ID", + "description": "Retrieve a planning by ID. Returns the planning object.", + "params": [ + { + "name": "id", + "description": "ID of planning to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "planning", + "description": "Planning object", + "schema": { + "$ref": "#/components/schemas/Planning" + } + } + }, + { + "name": "planning.set", + "summary": "Create or update a planning", + "description": "Create or update a planning. Returns the ID of the planning.", + "params": [ + { + "name": "planning", + "description": "Planning object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/Planning" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated planning", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "planning.delete", + "summary": "Delete a planning by ID", + "description": "Delete a planning by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of planning to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "planning.exist", + "summary": "Check if a planning exists by ID", + "description": "Check if a planning exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of planning to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the planning exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "planning.list", + "summary": "List all plannings", + "description": "List all plannings. Returns an array of planning objects.", + "params": [], + "result": { + "name": "plannings", + "description": "List of all planning objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Planning" + } + } + } + }, + { + "name": "profile.get", + "summary": "Get a profile by ID", + "description": "Retrieve a profile by ID. Returns the profile object.", + "params": [ + { + "name": "id", + "description": "ID of profile to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "profile", + "description": "Profile object", + "schema": { + "$ref": "#/components/schemas/Profile" + } + } + }, + { + "name": "profile.set", + "summary": "Create or update a profile", + "description": "Create or update a profile. Returns the ID of the profile.", + "params": [ + { + "name": "profile", + "description": "Profile object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/Profile" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated profile", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "profile.delete", + "summary": "Delete a profile by ID", + "description": "Delete a profile by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of profile to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "profile.exist", + "summary": "Check if a profile exists by ID", + "description": "Check if a profile exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of profile to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the profile exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "profile.list", + "summary": "List all profiles", + "description": "List all profiles. Returns an array of profile objects.", + "params": [], + "result": { + "name": "profiles", + "description": "List of all profile objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Profile" + } + } + } + }, + { + "name": "project.get", + "summary": "Get a project by ID", + "description": "Retrieve a project by ID. Returns the project object.", + "params": [ + { + "name": "id", + "description": "ID of project to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "project", + "description": "Project object", + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + { + "name": "project.set", + "summary": "Create or update a project", + "description": "Create or update a project. Returns the ID of the project.", + "params": [ + { + "name": "project", + "description": "Project object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/Project" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated project", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "project.delete", + "summary": "Delete a project by ID", + "description": "Delete a project by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of project to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "project.exist", + "summary": "Check if a project exists by ID", + "description": "Check if a project exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of project to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the project exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "project.list", + "summary": "List all projects", + "description": "List all projects. Returns an array of project objects.", + "params": [], + "result": { + "name": "projects", + "description": "List of all project objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + } + } + } + }, + { + "name": "project_issue.get", + "summary": "Get a project issue by ID", + "description": "Retrieve a project issue by ID. Returns the issue object.", + "params": [ + { + "name": "id", + "description": "ID of project issue to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "project_issue", + "description": "Project issue object", + "schema": { + "$ref": "#/components/schemas/ProjectIssue" + } + } + }, + { + "name": "project_issue.set", + "summary": "Create or update a project issue", + "description": "Create or update a project issue. Returns the ID of the issue.", + "params": [ + { + "name": "project_issue", + "description": "Project issue object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/ProjectIssue" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated project issue", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "project_issue.delete", + "summary": "Delete a project issue by ID", + "description": "Delete a project issue by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of project issue to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "project_issue.exist", + "summary": "Check if a project issue exists by ID", + "description": "Check if a project issue exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of project issue to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the project issue exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "project_issue.list", + "summary": "List all project issues", + "description": "List all project issues. Returns an array of issue objects.", + "params": [], + "result": { + "name": "project_issues", + "description": "List of all project issue objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectIssue" + } + } + } + }, + { + "name": "registration_desk.get", + "summary": "Get a registration desk by ID", + "description": "Retrieve a registration desk by ID. Returns the registration desk object.", + "params": [ + { + "name": "id", + "description": "ID of registration desk to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "registration_desk", + "description": "Registration desk object", + "schema": { + "$ref": "#/components/schemas/RegistrationDesk" + } + } + }, + { + "name": "registration_desk.set", + "summary": "Create or update a registration desk", + "description": "Create or update a registration desk. Returns the ID of the registration desk.", + "params": [ + { + "name": "registration_desk", + "description": "Registration desk object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/RegistrationDesk" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated registration desk", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "registration_desk.delete", + "summary": "Delete a registration desk by ID", + "description": "Delete a registration desk by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of registration desk to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "registration_desk.exist", + "summary": "Check if a registration desk exists by ID", + "description": "Check if a registration desk exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of registration desk to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the registration desk exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "registration_desk.list", + "summary": "List all registration desks", + "description": "List all registration desks. Returns an array of registration desk objects.", + "params": [], + "result": { + "name": "registration_desks", + "description": "List of all registration desk objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegistrationDesk" + } + } + } + }, + { + "name": "user.get", + "summary": "Get a user by ID", + "description": "Retrieve a user by ID. Returns the user object.", + "params": [ + { + "name": "id", + "description": "ID of user to fetch", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "user", + "description": "User object", + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + { + "name": "user.set", + "summary": "Create or update a user", + "description": "Create or update a user. Returns the ID of the user.", + "params": [ + { + "name": "user", + "description": "User object to create or update", + "required": true, + "schema": { + "$ref": "#/components/schemas/User" + } + } + ], + "result": { + "name": "id", + "description": "ID of the created/updated user", + "schema": { + "type": "integer", + "minimum": 0 + } + } + }, + { + "name": "user.delete", + "summary": "Delete a user by ID", + "description": "Delete a user by ID. Returns true if successful.", + "params": [ + { + "name": "id", + "description": "ID of user to delete", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "result", + "description": "Success result", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "user.exist", + "summary": "Check if a user exists by ID", + "description": "Check if a user exists by ID. Returns true or false.", + "params": [ + { + "name": "id", + "description": "ID of user to check", + "required": true, + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "result": { + "name": "exists", + "description": "Whether the user exists", + "schema": { + "type": "boolean" + } + } + }, + { + "name": "user.list", + "summary": "List all users", + "description": "List all users. Returns an array of user objects.", + "params": [], + "result": { + "name": "users", + "description": "List of all user objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } } - ], - "result": { - "name": "comment", - "description": "The requested comment object.", - "schema": { - "type": "object", - "example": { - "id": 1, - "text": "This is a sample comment", - "created_at": "2024-01-15T10:30:00Z" - } + ], + "components": { + "schemas": { + "Base": { + "type": "object", + "description": "Base properties inherited by all model objects", + "properties": { + "id": { + "type": "integer", + "minimum": 0, + "description": "Unique identifier", + "example": 1 + }, + "name": { + "type": "string", + "description": "Object name", + "example": "My Object" + }, + "description": { + "type": "string", + "description": "Object description", + "example": "A sample object description" + }, + "created_at": { + "type": "integer", + "description": "Unix timestamp when created", + "example": 1704110400 + }, + "updated_at": { + "type": "integer", + "description": "Unix timestamp when last updated", + "example": 1704110400 + }, + "securitypolicy": { + "type": "integer", + "minimum": 0, + "description": "Security policy ID", + "example": 1 + }, + "tags": { + "type": "integer", + "minimum": 0, + "description": "Tags ID", + "example": 1 + }, + "messages": { + "type": "array", + "description": "Associated message IDs", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 1, + 2, + 3 + ] + } + } + }, + "Calendar": { + "title": "Calendar", + "description": "A calendar object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "events": { + "type": "array", + "description": "IDs of calendar events", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 1, + 2, + 3 + ] + }, + "color": { + "type": "string", + "description": "Hex color code for the calendar", + "example": "#FF0000" + }, + "timezone": { + "type": "string", + "description": "Timezone for the calendar", + "example": "UTC" + }, + "is_public": { + "type": "boolean", + "description": "Whether the calendar is public", + "example": true + } + } + }, + "CalendarEvent": { + "title": "CalendarEvent", + "description": "A calendar event object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "title": { + "type": "string", + "description": "Event title", + "example": "Team Meeting" + }, + "start_time": { + "type": "integer", + "description": "Unix timestamp for event start", + "example": 1704110400 + }, + "end_time": { + "type": "integer", + "description": "Unix timestamp for event end", + "example": 1704114000 + }, + "registration_desks": { + "type": "array", + "description": "IDs of registration desks for tracking invitees", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 1, + 2 + ] + }, + "attendees": { + "type": "array", + "description": "List of event attendees", + "items": { + "$ref": "#/components/schemas/Attendee" + }, + "example": [] + }, + "docs": { + "type": "array", + "description": "Linked documents for the event", + "items": { + "$ref": "#/components/schemas/EventDoc" + }, + "example": [] + }, + "calendar_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the associated calendar", + "example": 1 + }, + "status": { + "type": "string", + "description": "Current status of the event", + "enum": [ + "draft", + "published", + "cancelled", + "completed" + ], + "example": "published" + }, + "is_all_day": { + "type": "boolean", + "description": "Whether this is an all-day event", + "example": false + }, + "reminder_mins": { + "type": "array", + "description": "Minutes before event for reminders", + "items": { + "type": "integer" + }, + "example": [ + 15, + 60 + ] + }, + "color": { + "type": "string", + "description": "Hex color code for the event", + "example": "#0000FF" + }, + "timezone": { + "type": "string", + "description": "Timezone for the event", + "example": "UTC" + }, + "priority": { + "type": "string", + "description": "Event priority level", + "enum": [ + "low", + "normal", + "urgent" + ], + "example": "normal" + }, + "public": { + "type": "boolean", + "description": "Whether the event is public", + "example": true + }, + "locations": { + "type": "array", + "description": "Event locations", + "items": { + "$ref": "#/components/schemas/EventLocation" + }, + "example": [] + }, + "is_template": { + "type": "boolean", + "description": "Whether this is a template event", + "example": false + } + } + }, + "Attendee": { + "title": "Attendee", + "description": "An event attendee", + "type": "object", + "properties": { + "user_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the user", + "example": 123 + }, + "status_latest": { + "type": "string", + "description": "Latest attendance status", + "enum": [ + "invited", + "accepted", + "declined", + "tentative" + ], + "example": "accepted" + }, + "attendance_required": { + "type": "boolean", + "description": "Whether attendance is required", + "example": true + }, + "admin": { + "type": "boolean", + "description": "Whether user can manage the event", + "example": false + }, + "organizer": { + "type": "boolean", + "description": "Whether user is an organizer", + "example": false + }, + "location": { + "type": "string", + "description": "Optional location for this attendee", + "example": "Conference Room A" + }, + "log": { + "type": "array", + "description": "Attendance status log", + "items": { + "$ref": "#/components/schemas/AttendeeLog" + }, + "example": [] + } + } + }, + "AttendeeLog": { + "title": "AttendeeLog", + "description": "An attendance status log entry", + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": 0, + "description": "Unix timestamp of status change", + "example": 1704110400 + }, + "status": { + "type": "string", + "description": "Attendance status", + "enum": [ + "invited", + "accepted", + "declined", + "tentative" + ], + "example": "accepted" + }, + "remark": { + "type": "string", + "description": "Optional remark about status change", + "example": "Looking forward to it!" + } + } + }, + "EventDoc": { + "title": "EventDoc", + "description": "A document linked to an event", + "type": "object", + "properties": { + "fs_item": { + "type": "integer", + "minimum": 0, + "description": "File system item ID", + "example": 456 + }, + "cat": { + "type": "string", + "description": "Document category (lowercase)", + "example": "agenda" + }, + "public": { + "type": "boolean", + "description": "Whether document is public", + "example": true + } + } + }, + "EventLocation": { + "title": "EventLocation", + "description": "An event location", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Location name", + "example": "Conference Room A" + }, + "description": { + "type": "string", + "description": "Location description", + "example": "Main building, 2nd floor" + }, + "cat": { + "type": "string", + "description": "Location category", + "enum": [ + "online", + "physical", + "hybrid" + ], + "example": "physical" + }, + "docs": { + "type": "array", + "description": "Documents for this location", + "items": { + "$ref": "#/components/schemas/EventDoc" + }, + "example": [] + } + } + }, + "ChatGroup": { + "title": "ChatGroup", + "description": "A chat group object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "chat_type": { + "type": "string", + "description": "Type of chat group", + "enum": [ + "public_channel", + "private_channel", + "direct_message", + "group_message" + ], + "example": "public_channel" + }, + "last_activity": { + "type": "integer", + "description": "Unix timestamp of last activity", + "example": 1704110400 + }, + "is_archived": { + "type": "boolean", + "description": "Whether the chat group is archived", + "example": false + }, + "group_id": { + "type": "integer", + "minimum": 0, + "description": "Associated group ID", + "example": 1 + } + } + }, + "ChatMessage": { + "title": "ChatMessage", + "description": "A chat message object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "content": { + "type": "string", + "description": "Message content", + "example": "Hello everyone! How is the project going?" + }, + "chat_group_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the chat group", + "example": 1 + }, + "sender_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the message sender", + "example": 123 + }, + "parent_messages": { + "type": "array", + "description": "Links to parent messages (replies, references)", + "items": { + "$ref": "#/components/schemas/MessageLink" + }, + "example": [] + }, + "fs_files": { + "type": "array", + "description": "File system item IDs attached to message", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 201, + 202 + ] + }, + "message_type": { + "type": "string", + "description": "Type of message", + "enum": [ + "text", + "image", + "file", + "voice", + "video", + "system", + "announcement" + ], + "example": "text" + }, + "status": { + "type": "string", + "description": "Message delivery status", + "enum": [ + "sent", + "delivered", + "read", + "failed", + "deleted" + ], + "example": "delivered" + }, + "reactions": { + "type": "array", + "description": "User reactions to the message", + "items": { + "$ref": "#/components/schemas/MessageReaction" + }, + "example": [] + }, + "mentions": { + "type": "array", + "description": "User IDs mentioned in the message", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 456, + 789 + ] + } + } + }, + "MessageLink": { + "title": "MessageLink", + "description": "A link to another message", + "type": "object", + "properties": { + "message_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the linked message", + "example": 456 + }, + "link_type": { + "type": "string", + "description": "Type of link relationship", + "enum": [ + "reply", + "reference", + "forward", + "quote" + ], + "example": "reply" + } + } + }, + "MessageReaction": { + "title": "MessageReaction", + "description": "A reaction to a message", + "type": "object", + "properties": { + "user_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the user who reacted", + "example": 123 + }, + "emoji": { + "type": "string", + "description": "Emoji used for reaction", + "example": "👍" + }, + "timestamp": { + "type": "integer", + "description": "Unix timestamp when reaction was added", + "example": 1704110400 + } + } + }, + "Contact": { + "title": "Contact", + "description": "A contact object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "emails": { + "type": "array", + "description": "Email addresses", + "items": { + "type": "string" + }, + "example": [ + "john.doe@example.com", + "john@company.com" + ] + }, + "user_id": { + "type": "integer", + "minimum": 0, + "description": "Associated user ID", + "example": 123 + }, + "phones": { + "type": "array", + "description": "Phone numbers", + "items": { + "type": "string" + }, + "example": [ + "+1-555-123-4567", + "+1-555-987-6543" + ] + }, + "addresses": { + "type": "array", + "description": "Physical addresses", + "items": { + "type": "string" + }, + "example": [ + "123 Main St, City, State 12345" + ] + }, + "avatar_url": { + "type": "string", + "description": "URL to avatar image", + "example": "https://example.com/avatar.jpg" + }, + "bio": { + "type": "string", + "description": "Biography or description", + "example": "Software Engineer with 5 years experience" + }, + "timezone": { + "type": "string", + "description": "Timezone", + "example": "UTC" + }, + "status": { + "type": "string", + "description": "Contact status", + "enum": [ + "active", + "inactive" + ], + "example": "active" + }, + "profile_ids": { + "type": "array", + "description": "Associated profile IDs", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 1, + 2 + ] + } + } + }, + "Group": { + "title": "Group", + "description": "A group object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "members": { + "type": "array", + "description": "Group members", + "items": { + "$ref": "#/components/schemas/GroupMember" + }, + "example": [] + }, + "subgroups": { + "type": "array", + "description": "IDs of child groups", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 10, + 11 + ] + }, + "parent_group": { + "type": "integer", + "minimum": 0, + "description": "ID of parent group", + "example": 5 + }, + "is_public": { + "type": "boolean", + "description": "Whether the group is public", + "example": true + } + } + }, + "GroupMember": { + "title": "GroupMember", + "description": "A group member", + "type": "object", + "properties": { + "user_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the user", + "example": 123 + }, + "role": { + "type": "string", + "description": "Member role in the group", + "enum": [ + "reader", + "writer", + "admin", + "owner" + ], + "example": "writer" + }, + "joined_at": { + "type": "integer", + "description": "Unix timestamp when user joined", + "example": 1704110400 + } + } + }, + "Message": { + "title": "Message", + "description": "A message object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "subject": { + "type": "string", + "description": "Message subject", + "example": "Project Update - Week 1" + }, + "message": { + "type": "string", + "description": "Message content", + "example": "Here's the weekly project update with current progress and next steps." + }, + "parent": { + "type": "integer", + "minimum": 0, + "description": "ID of parent message (for replies)", + "example": 456 + }, + "author": { + "type": "integer", + "minimum": 0, + "description": "ID of message author", + "example": 123 + }, + "to": { + "type": "array", + "description": "IDs of primary recipients", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 789, + 101 + ] + }, + "cc": { + "type": "array", + "description": "IDs of CC recipients", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 102, + 103 + ] + }, + "send_log": { + "type": "array", + "description": "Log of message delivery attempts", + "items": { + "$ref": "#/components/schemas/SendLog" + }, + "example": [] + } + } + }, + "SendLog": { + "title": "SendLog", + "description": "A send log entry", + "type": "object", + "properties": { + "to": { + "type": "array", + "description": "IDs of recipients in this send attempt", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 789, + 101 + ] + }, + "cc": { + "type": "array", + "description": "IDs of CC recipients in this send attempt", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 102 + ] + }, + "status": { + "type": "string", + "description": "Delivery status", + "enum": [ + "sent", + "received", + "acknowledged" + ], + "example": "sent" + }, + "timestamp": { + "type": "integer", + "minimum": 0, + "description": "Unix timestamp of send attempt", + "example": 1704110400 + } + } + }, + "Planning": { + "title": "Planning", + "description": "A planning object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "color": { + "type": "string" + }, + "timezone": { + "type": "string" + }, + "is_public": { + "type": "boolean" + }, + "calendar_template_id": { + "type": "integer", + "minimum": 0 + }, + "registration_desk_id": { + "type": "integer", + "minimum": 0 + }, + "autoschedule_rules": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PlanningRecurrenceRule" + } + }, + "invite_rules": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PlanningRecurrenceRule" + } + }, + "attendees_required": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + } + }, + "attendees_optional": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + } + } + } + }, + "PlanningRecurrenceRule": { + "title": "PlanningRecurrenceRule", + "description": "A planning recurrence rule", + "type": "object", + "properties": { + "until": { + "type": "integer", + "minimum": 0 + }, + "by_weekday": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0, + "maximum": 7 + } + }, + "by_monthday": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1, + "maximum": 31 + } + }, + "hour_from": { + "type": "integer", + "minimum": 0, + "maximum": 23 + }, + "hour_to": { + "type": "integer", + "minimum": 0, + "maximum": 23 + }, + "duration": { + "type": "integer", + "minimum": 0 + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 10 + } + } + }, + "Profile": { + "title": "Profile", + "description": "A profile object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "user_id": { + "type": "integer", + "minimum": 0 + }, + "summary": { + "type": "string" + }, + "headline": { + "type": "string" + }, + "location": { + "type": "string" + }, + "industry": { + "type": "string" + }, + "picture_url": { + "type": "string" + }, + "background_image_url": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "website": { + "type": "string" + }, + "experience": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Experience" + } + }, + "education": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Education" + } + }, + "skills": { + "type": "array", + "items": { + "type": "string" + } + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Experience": { + "title": "Experience", + "description": "A work experience entry", + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "company": { + "type": "string" + }, + "location": { + "type": "string" + }, + "start_date": { + "type": "integer", + "minimum": 0 + }, + "end_date": { + "type": "integer", + "minimum": 0 + }, + "current": { + "type": "boolean" + }, + "description": { + "type": "string" + } + } + }, + "Education": { + "title": "Education", + "description": "An education entry", + "type": "object", + "properties": { + "school": { + "type": "string" + }, + "degree": { + "type": "string" + }, + "field_of_study": { + "type": "string" + }, + "start_date": { + "type": "integer", + "minimum": 0 + }, + "end_date": { + "type": "integer", + "minimum": 0 + }, + "description": { + "type": "string" + } + } + }, + "Project": { + "title": "Project", + "description": "A project object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "swimlanes": { + "type": "array", + "description": "Project swimlanes for organizing work", + "items": { + "$ref": "#/components/schemas/Swimlane" + }, + "example": [] + }, + "milestones": { + "type": "array", + "description": "Project milestones", + "items": { + "$ref": "#/components/schemas/Milestone" + }, + "example": [] + }, + "fs_files": { + "type": "array", + "description": "File system item IDs associated with project", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 101, + 102, + 103 + ] + }, + "status": { + "type": "string", + "description": "Current project status", + "enum": [ + "planning", + "active", + "on_hold", + "completed", + "cancelled" + ], + "example": "active" + }, + "start_date": { + "type": "integer", + "description": "Unix timestamp for project start date", + "example": 1704110400 + }, + "end_date": { + "type": "integer", + "description": "Unix timestamp for project end date", + "example": 1706788800 + } + } + }, + "Swimlane": { + "title": "Swimlane", + "description": "A project swimlane", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Swimlane name", + "example": "To Do" + }, + "description": { + "type": "string", + "description": "Swimlane description", + "example": "Tasks that need to be started" + }, + "order": { + "type": "integer", + "description": "Display order", + "example": 1 + }, + "color": { + "type": "string", + "description": "Hex color code", + "example": "#FF0000" + }, + "is_done": { + "type": "boolean", + "description": "Whether this swimlane represents completed work", + "example": false + } + } + }, + "Milestone": { + "title": "Milestone", + "description": "A project milestone", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Milestone name", + "example": "Phase 1 Complete" + }, + "description": { + "type": "string", + "description": "Milestone description", + "example": "Complete all Phase 1 deliverables" + }, + "due_date": { + "type": "integer", + "description": "Unix timestamp for due date", + "example": 1706788800 + }, + "completed": { + "type": "boolean", + "description": "Whether milestone is completed", + "example": false + }, + "issues": { + "type": "array", + "description": "Issue IDs associated with this milestone", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 1, + 2, + 3 + ] + } + } + }, + "ProjectIssue": { + "title": "ProjectIssue", + "description": "A project issue object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "title": { + "type": "string", + "description": "Issue title", + "example": "Implement user authentication system" + }, + "project_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the associated project", + "example": 1 + }, + "issue_type": { + "type": "string", + "description": "Type of issue", + "enum": [ + "task", + "story", + "bug", + "question", + "epic", + "subtask" + ], + "example": "task" + }, + "priority": { + "type": "string", + "description": "Issue priority level", + "enum": [ + "lowest", + "low", + "medium", + "high", + "highest", + "critical" + ], + "example": "medium" + }, + "status": { + "type": "string", + "description": "Current issue status", + "enum": [ + "open", + "in_progress", + "blocked", + "review", + "testing", + "done", + "closed" + ], + "example": "open" + }, + "swimlane": { + "type": "string", + "description": "Swimlane name for organization", + "example": "To Do" + }, + "assignees": { + "type": "array", + "description": "IDs of users assigned to this issue", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 123, + 456 + ] + }, + "reporter": { + "type": "integer", + "minimum": 0, + "description": "ID of user who reported the issue", + "example": 789 + }, + "milestone": { + "type": "string", + "description": "Milestone name", + "example": "Phase 1 Complete" + }, + "deadline": { + "type": "integer", + "description": "Unix timestamp for deadline", + "example": 1706788800 + }, + "estimate": { + "type": "integer", + "description": "Estimated hours to complete", + "example": 8 + }, + "fs_files": { + "type": "array", + "description": "File system item IDs attached to issue", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 301, + 302 + ] + }, + "parent_id": { + "type": "integer", + "minimum": 0, + "description": "ID of parent issue (for subtasks)", + "example": 10 + }, + "children": { + "type": "array", + "description": "IDs of child issues (subtasks)", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 11, + 12 + ] + } + } + }, + "RegistrationDesk": { + "title": "RegistrationDesk", + "description": "A registration desk object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "fs_items": { + "type": "array", + "description": "File attachments for registration", + "items": { + "$ref": "#/components/schemas/RegistrationFileAttachment" + }, + "example": [] + }, + "white_list": { + "type": "array", + "description": "User IDs allowed to register", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 123, + 456, + 789 + ] + }, + "white_list_accepted": { + "type": "array", + "description": "User IDs from whitelist who have been accepted", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 123, + 456 + ] + }, + "required_list": { + "type": "array", + "description": "User IDs required to register", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 123 + ] + }, + "black_list": { + "type": "array", + "description": "User IDs blocked from registration", + "items": { + "type": "integer", + "minimum": 0 + }, + "example": [ + 999 + ] + }, + "start_time": { + "type": "integer", + "minimum": 0, + "description": "Unix timestamp when registration opens", + "example": 1704110400 + }, + "end_time": { + "type": "integer", + "minimum": 0, + "description": "Unix timestamp when registration closes", + "example": 1706788800 + }, + "acceptance_required": { + "type": "boolean", + "description": "Whether registrations require manual acceptance", + "example": true + }, + "registrations": { + "type": "array", + "description": "List of registrations", + "items": { + "$ref": "#/components/schemas/Registration" + }, + "example": [] + } + } + }, + "RegistrationFileAttachment": { + "title": "RegistrationFileAttachment", + "description": "A file attachment for registration", + "type": "object", + "properties": { + "fs_item": { + "type": "integer", + "minimum": 0, + "description": "File system item ID", + "example": 401 + }, + "cat": { + "type": "string", + "description": "File category", + "example": "document" + }, + "public": { + "type": "boolean", + "description": "Whether file is publicly accessible", + "example": false + } + } + }, + "Registration": { + "title": "Registration", + "description": "A registration entry", + "type": "object", + "properties": { + "user_id": { + "type": "integer", + "minimum": 0, + "description": "ID of the registered user", + "example": 123 + }, + "accepted": { + "type": "boolean", + "description": "Whether registration has been accepted", + "example": true + }, + "accepted_by": { + "type": "integer", + "minimum": 0, + "description": "ID of user who accepted the registration", + "example": 456 + }, + "timestamp": { + "type": "integer", + "minimum": 0, + "description": "Unix timestamp when registration was submitted", + "example": 1704110400 + }, + "timestamp_acceptation": { + "type": "integer", + "minimum": 0, + "description": "Unix timestamp when registration was accepted", + "example": 1704196800 + } + } + }, + "User": { + "title": "User", + "description": "A user object", + "allOf": [ + { + "$ref": "#/components/schemas/Base" + } + ], + "properties": { + "user_id": { + "type": "integer", + "minimum": 0, + "description": "User ID from ledger system", + "example": 456 + }, + "contact_id": { + "type": "integer", + "minimum": 0, + "description": "Associated contact ID", + "example": 123 + }, + "status": { + "type": "string", + "description": "User status", + "enum": [ + "active", + "inactive", + "suspended", + "pending" + ], + "example": "active" + }, + "profile_ids": { + "type": "array", + "description": "Associated profile IDs", + "items": { + "type": "string" + }, + "example": [ + "profile_1", + "profile_2" + ] + } + } + } } - } } - ], - "components": {} } \ No newline at end of file diff --git a/examples/hero/heroserver/openrpc_back.json b/examples/hero/heroserver/openrpc_back.json new file mode 100644 index 00000000..8115d3a2 --- /dev/null +++ b/examples/hero/heroserver/openrpc_back.json @@ -0,0 +1,69 @@ +{ + "openrpc": "1.2.6", + "info": { + "title": "Comment Service", + "description": "A simple service for managing comments.", + "version": "1.0.0" + }, + "methods": [ + { + "name": "add_comment", + "summary": "Add a new comment", + "params": [ + { + "name": "text", + "description": "The content of the comment.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "comment_id", + "description": "The ID of the newly created comment.", + "schema": { + "type": "string" + } + } + }, + { + "name": "get_comment", + "summary": "Get a comment by ID", + "description": "Retrieves a specific comment using its unique identifier.", + "params": [ + { + "name": "id", + "description": "The unique identifier of the comment to retrieve.", + "required": true, + "schema": { + "type": "number", + "example": "1" + } + }, + { + "name": "include_metadata", + "description": "Whether to include metadata in the response.", + "required": false, + "schema": { + "type": "boolean", + "example": true + } + } + ], + "result": { + "name": "comment", + "description": "The requested comment object.", + "schema": { + "type": "object", + "example": { + "id": 1, + "text": "This is a sample comment", + "created_at": "2024-01-15T10:30:00Z" + } + } + } + } + ], + "components": {} +} \ No newline at end of file diff --git a/lib/hero/heromodels/prd_test.v b/lib/hero/heromodels/prd_test.v index ebd47ebc..3c13a60c 100644 --- a/lib/hero/heromodels/prd_test.v +++ b/lib/hero/heromodels/prd_test.v @@ -17,7 +17,6 @@ fn test_prd_new() ! { use_cases: [] requirements: [] constraints: [] - risks: {} } prd := db_prd.new(args)! @@ -30,7 +29,6 @@ fn test_prd_new() ! { assert prd.use_cases.len == 0 assert prd.requirements.len == 0 assert prd.constraints.len == 0 - assert prd.risks.len == 0 assert prd.updated_at > 0 println('✓ PRD new test passed!') @@ -52,7 +50,6 @@ fn test_prd_crud_operations() ! { use_cases: [] requirements: [] constraints: [] - risks: {} } mut prd := db_prd.new(args)! @@ -124,9 +121,6 @@ fn test_prd_encoding_decoding_complex() ! { ctype: .technica } - mut risks := map[string]string{} - risks['RISK1'] = 'Mitigation strategy here' - mut args := PrdArg{ product_name: 'Complex Test Product' version: 'v2.0' @@ -136,7 +130,6 @@ fn test_prd_encoding_decoding_complex() ! { use_cases: [use_case] requirements: [requirement] constraints: [constraint] - risks: risks } mut prd := db_prd.new(args)! @@ -164,9 +157,6 @@ fn test_prd_encoding_decoding_complex() ! { assert retrieved_prd.constraints[0].id == 'C1' assert retrieved_prd.constraints[0].ctype == .technica - assert retrieved_prd.risks.len == 1 - assert retrieved_prd.risks['RISK1'] == 'Mitigation strategy here' - println('✓ PRD encoding/decoding complex test passed!') } @@ -185,7 +175,6 @@ fn test_prd_type_name() ! { use_cases: [] requirements: [] constraints: [] - risks: {} } prd := db_prd.new(args)! @@ -200,6 +189,11 @@ fn test_prd_list() ! { mut db_prd := DBPrd{ db: &mydb } + // Clear any existing PRDs before running the test + existing_prds := db_prd.list()! + for prd_id in existing_prds { + db_prd.delete[ProductRequirementsDoc](u32(prd_id))! + } // Create multiple PRDs for i in 0 .. 3 { @@ -212,7 +206,6 @@ fn test_prd_list() ! { use_cases: [] requirements: [] constraints: [] - risks: {} } mut prd := db_prd.new(args)! prd = db_prd.set(prd)!