Update git remote URL from git.threefold.info to git.ourworld.tf

This commit is contained in:
2025-08-04 10:44:17 +02:00
parent 0cf66642a2
commit aa7e79d26c
85 changed files with 1865 additions and 392 deletions

View File

@@ -0,0 +1,12 @@
module base
import freeflowuniverse.herolib.data.ourtime
// our attempt to make a message object which can be used for email as well as chat
pub struct Base {
pub mut:
id u32
creation_time ourtime.OurTime
mod_time ourtime.OurTime // Last modified time
comments []u32
}

View File

@@ -0,0 +1,43 @@
module biz
import base
import freeflowuniverse.herolib.data.ourtime
// CompanyStatus represents the status of a company
pub enum CompanyStatus {
active
inactive
suspended
}
// BusinessType represents the type of a business
pub enum BusinessType {
coop
single
twin
starter
global
}
// Company represents a company registered in the Freezone
pub struct Company {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
// id u32 is provided by base.Base
name string
registration_number string
incorporation_date ourtime.OurTime
fiscal_year_end string
email string
phone string
website string
address string
business_type BusinessType
industry string
description string
status CompanyStatus
// created_at is provided by base.Base.creation_time
// updated_at is provided by base.Base.mod_time
shareholders []Shareholder
}

View File

@@ -0,0 +1,44 @@
module biz
import base
import freeflowuniverse.herolib.data.ourtime
import freeflowuniverse.herolib.data.currency
// import freeflowuniverse.herolib.core.texttools { name_fix }
// ProductType represents the type of a product
pub enum ProductType {
product
service
}
// ProductStatus represents the status of a product
pub enum ProductStatus {
available
unavailable
}
// ProductComponent represents a component or sub-part of a product.
// Its lifecycle is tied to the parent Product and it does not have its own independent ID.
pub struct ProductComponent {
pub mut:
name string
description string
quantity int
}
// Product represents a product or service offered
pub struct Product {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
name string
description string
price currency.Currency
type_ ProductType
category string
status ProductStatus
max_amount u16 // Maximum available quantity of this product, if applicable
purchase_till ourtime.OurTime // Date until which this product can be purchased
active_till ourtime.OurTime // Date until which this product/service remains active (e.g., for subscriptions)
components []ProductComponent // List of components that make up this product
}

View File

@@ -0,0 +1,43 @@
module biz
import base
import freeflowuniverse.herolib.data.ourtime
import freeflowuniverse.herolib.data.currency
// SaleStatus represents the status of a sale
pub enum SaleStatus {
pending
completed
cancelled
}
// Sale represents a sale of products or services
pub struct Sale {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
// id u32 is provided by base.Base
company_id u32 // Reference to Company.id that made the sale
buyer_name string
buyer_email string
total_amount currency.Currency
status SaleStatus
sale_date ourtime.OurTime
// created_at is provided by base.Base.creation_time
// updated_at is provided by base.Base.mod_time
items []SaleItem
}
// SaleItem represents an individual item within a Sale.
// Its lifecycle is tied to the parent Sale.
pub struct SaleItem {
pub mut:
// id u32 - Removed, component of Sale
// sale_id u32 - Removed, implicit link to parent Sale
product_id u32 // Reference to Product.id
name string // Denormalized product name at time of sale
quantity int
unit_price currency.Currency // Price per unit at time of sale
subtotal currency.Currency
service_active_until ourtime.OurTime? // Optional: For services, date until this specific purchased instance is active
}

View File

@@ -0,0 +1,27 @@
module biz
import base
import freeflowuniverse.herolib.data.ourtime
// ShareholderType represents the type of shareholder
pub enum ShareholderType {
individual
corporate
}
// Shareholder represents a shareholder of a company
pub struct Shareholder {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
// id u32 is provided by base.Base
company_id u32 // Reference to Company.id
user_id u32 // Reference to User.id (if individual) or another entity ID (if corporate)
name string // Denormalized name of the shareholder (user or corporate entity)
shares f64 // Number of shares held
percentage f64 // Percentage of ownership
type_ ShareholderType
since ourtime.OurTime // Date since becoming a shareholder
// created_at is provided by base.Base.creation_time
// updated_at is provided by base.Base.mod_time
}

View File

@@ -0,0 +1,5 @@
module biz
// DEPRECATED: This file is deprecated and should not be used.
// Please use circle.User instead, which has all the necessary fields for MCC functionality.
// The biz.User struct has been removed as per the specifications.

View File

@@ -0,0 +1,15 @@
module circle
// Attachment represents an attachment usable for any object
// such as email, chat, etc.
// It is a generic struct that can be used for any object
// that requires an attachment.
pub struct Attachment {
pub mut:
filename string
content_type string
hash string // Hash of the attachment data
size u32 // Size in bytes
}

View File

@@ -0,0 +1,39 @@
module mcc
import base
//there is only 1 of this per circle called "configs"
pub struct Configs {
base.Base
pub mut:
configs map[string]Config //string is namefixed
}
//generic config per circle, can be more than 1
pub struct Config {
base.Base
pub mut:
name string
labels []Label
colors []Color
}
pub struct Label {
base.Base
pub mut:
name string
comment string
color u16
}
pub struct Color {
base.Base
pub mut:
id u16
name string
comment string
colorcode string //hex color code
}

View File

@@ -0,0 +1,36 @@
module circle
import base
// Define the RecordType enum
pub enum RecordType {
a
aaa
cname
mx
ns
ptr
soa
srv
txt
}
// Define the DomainNamespace struct, represents a full domain with all its records
pub struct DomainNameSpace {
base.Base
pub mut:
id u32
domain string
description string
records []Record
admins []u32 // IDs of the admins they need to exist as user in the circle
}
// Define the Record struct
pub struct Record {
pub mut:
name string
text string
category RecordType
addr []string
}

View File

@@ -0,0 +1,12 @@
module circle
import base
// there is one group called "everyone" which is the default group for all members and their roles
pub struct Group {
base.Base
pub mut:
name string // name of the group in a circle, the one "everyone" is the default group
description string // optional description
members []u32 // pointers to the members of this group
}

View File

@@ -0,0 +1,42 @@
module circle
import freeflowuniverse.herolib.data.ourtime
import base
// Role represents the role of a member in a circle
pub enum Role {
admin
stakeholder
member
contributor
guest
external // means no right in this circle appart from we register this user
}
// UserPreferences represents user preferences for MCC
pub struct UserPreferences {
pub mut:
default_calendar_id u32 // Default calendar ID
default_view string // Default view (day, week, month)
email_signature string // Default email signature
theme string // UI theme preference
notifications bool // Enable/disable notifications
}
// User represents a member of a circle
pub struct User {
base.Base
pub mut:
name string // name of the member as used in this circle
description string // optional description which is relevant to this circle
role Role // role of the member in the circle
contact_ids []u32 // IDs of contacts linked to this member
wallet_ids []u32 // IDs of wallets owned by this member which are relevant to this circle
pubkey string // public key of the member as used in this circle
// Additional fields needed for MCC functionality
email string // Primary email address
timezone string // User's preferred timezone
preferences UserPreferences // User preferences for MCC
}

View File

@@ -0,0 +1,31 @@
module crm
import base
import freeflowuniverse.herolib.data.ourtime
// Account represents a business or organization.
// Enums like AccountType and AccountIndustry have been removed for broader applicability.
// Fields previously using these enums now use `string` type.
pub struct Account {
base.Base // Base struct for common fields
pub mut:
name string
typ string // Type of account (e.g., Customer, Partner) - formerly AccountType enum
industry string // Industry of the account (e.g., Technology, Healthcare) - formerly AccountIndustry enum
employees u32
annual_revenue f64
billing_street string
billing_city string
billing_state string
billing_postal_code string
billing_country string
shipping_street string
shipping_city string
shipping_state string
shipping_postal_code string
shipping_country string
description string
assigned_user_id u32 // Reference to User
created_by_id u32 // Reference to User
primary_contact_id u32? // Optional: Reference to Contact
}

View File

@@ -0,0 +1,39 @@
module crm
import base
import freeflowuniverse.herolib.data.ourtime
// CallStatus represents the status of a call
pub enum CallStatus {
planned
held
not_held
canceled
}
// CallDirection represents the direction of a call
pub enum CallDirection {
outbound
inbound
}
// Call represents a phone call in the CRM system
pub struct Call {
base.Base // Base struct for common fields (id u32, creation_time, mod_time)
pub mut:
name string
status CallStatus
direction CallDirection
date_start ourtime.OurTime
duration u32 // Duration in minutes
description string
parent_type string // Can be 'Account', 'Contact', 'Lead', 'Opportunity', 'Case'
parent_id u32 // Reference to the parent entity
account_id u32 // Reference to Account
contact_id u32 // Reference to Contact
lead_id u32 // Reference to Lead
phone_number string
recording_url string // Optional
assigned_user_id u32 // Reference to User
created_by_id u32 // Reference to User
}

View File

@@ -0,0 +1,57 @@
module crm
import base
import freeflowuniverse.herolib.data.ourtime
// CampaignStatus represents the status of a marketing campaign
pub enum CampaignStatus {
planning
active
inactive
complete
canceled
}
// CampaignType represents the type of a marketing campaign
pub enum CampaignType {
email
newsletter
web
television
radio
mail
print
social_media
telemarketing
event
other
}
// Campaign represents a marketing campaign in the CRM system
pub struct Campaign {
base.Base // Base struct for common fields (id u32, creation_time, mod_time)
pub mut:
name string
status CampaignStatus
type CampaignType
start_date ourtime.OurTime
end_date ourtime.OurTime
budget f64
expected_revenue f64
expected_cost f64
actual_cost f64
objective string
description string
target_audience string
sent_count u32
open_count u32
click_count u32
bounce_count u32
opt_out_count u32
lead_count u32
opportunity_count u32
revenue f64
roi f64 // Return on Investment
assigned_user_id u32 // Reference to User
created_by_id u32 // Reference to User
}

View File

@@ -0,0 +1,53 @@
module crm
import base
import freeflowuniverse.herolib.data.ourtime
// CaseStatus represents the status of a support case
pub enum CaseStatus {
new
assigned
pending
closed
rejected
duplicate
}
// CasePriority represents the priority of a support case
pub enum CasePriority {
low
medium
high
urgent
}
// CaseType represents the type of a support case
pub enum CaseType {
question
incident
problem
feature_request
bug
}
// Case represents a customer support case in the CRM system
pub struct Case {
base.Base // Base struct for common fields (id u32, creation_time, mod_time)
pub mut:
// id u32 // Removed, provided by base.Base
number string // Auto-generated case number (e.g., "C-00001")
name string
status CaseStatus
priority CasePriority
type CaseType
account_id u32 // Reference to Account
contact_id u32 // Reference to Contact
description string
resolution string // Optional
solution string // Optional
resolved_at ourtime.OurTime // Optional
// created_at ourtime.OurTime // Removed, provided by base.Base.creation_time
// updated_at ourtime.OurTime // Removed, provided by base.Base.mod_time
assigned_user_id u32 // Reference to User
created_by_id u32 // Reference to User
}

View File

@@ -0,0 +1,35 @@
module crm
import base
import freeflowuniverse.herolib.data.ourtime
// Contact represents an individual person in the CRM system.
pub struct Contact {
base.Base // Provides id u32, creation_time, mod_time
pub mut:
first_name string
last_name string
title string // e.g., Mr., Ms., Dr.
email string
phone string
mobile string
job_title string
department string // Optional
// company_id u32 // Optional: If directly linked to a primary company/account
// reports_to_id u32 // Optional: Contact ID of their manager
// Address fields
address_street string
address_city string
address_state string
address_postal_code string
address_country string
description string // General notes about the contact
do_not_call bool
email_opt_out bool
// Social media profiles could be added here too
// linkedin_profile string
// twitter_profile string
}

View File

@@ -0,0 +1,47 @@
module crm
import base
import freeflowuniverse.herolib.data.ourtime
// LeadStatus represents the status of a lead
pub enum LeadStatus {
new
assigned
in_process
converted
recycled
dead
}
// LeadSource represents the source of a lead
pub enum LeadSource {
website
call
email
existing_customer
partner
public_relations
campaign
conference
trade_show
word_of_mouth
other
}
// Lead represents a potential customer in the CRM system
pub struct Lead {
base.Base // Base struct for common fields (id u32, creation_time, mod_time)
pub mut:
// id u32 // Removed, provided by base.Base
contact_id u32 // Reference to a Contact (holds name, email, phone etc.)
description string
status LeadStatus
source LeadSource
opportunity_amount f64 // Optional: If lead is converted, this could be initial amount
opportunity_name string // Optional: If lead is converted, this could be initial name
converted_at ourtime.OurTime // Optional: Timestamp when lead was converted
// created_at ourtime.OurTime // Removed, provided by base.Base.creation_time
// updated_at ourtime.OurTime // Removed, provided by base.Base.mod_time
assigned_user_id u32 // Reference to User
created_by_id u32 // Reference to User
}

View File

@@ -0,0 +1,57 @@
module crm
import base
import freeflowuniverse.herolib.data.ourtime
// Opportunity represents a potential sale in the CRM system
pub struct Opportunity {
base.Base // Base struct for common fields (id u32, creation_time, mod_time)
pub mut:
// id u32 // Removed, provided by base.Base
name string
account_id u32 // Reference to Account
amount f64
close_date ourtime.OurTime // Expected close date
probability f64 // Percentage (0-100)
stage OpportunityStage
source OpportunitySource
lead_source string // More specific lead source details if needed
campaign_id u32 // Optional: Reference to Campaign
description string
next_step string // Optional
competition string // Optional
// created_at ourtime.OurTime // Removed, provided by base.Base.creation_time
// updated_at ourtime.OurTime // Removed, provided by base.Base.mod_time
assigned_user_id u32 // Reference to User
created_by_id u32 // Reference to User
contacts []u32 // References to Contacts associated with this opportunity
}
// OpportunityStage represents the stage of an opportunity
pub enum OpportunityStage {
prospecting
qualification
needs_analysis
value_proposition
id_decision_makers
perception_analysis
proposal_price_quote
negotiation_review
closed_won
closed_lost
}
// OpportunitySource represents the source of an opportunity
pub enum OpportunitySource {
call
email
existing_customer
partner
public_relations
campaign
web_site
conference
trade_show
word_of_mouth
other
}

View File

@@ -0,0 +1,43 @@
module crm
import base
import freeflowuniverse.herolib.data.ourtime
// TaskStatus represents the status of a task
pub enum TaskStatus {
not_started
in_progress
completed
deferred
canceled
}
// TaskPriority represents the priority of a task
pub enum TaskPriority {
low
medium
high
urgent
}
// Task represents a task or to-do item in the CRM system
pub struct Task {
base.Base // Base struct for common fields (id u32, creation_time, mod_time)
pub mut:
// id u32 // Removed, provided by base.Base
name string
status TaskStatus
priority TaskPriority
due_date ourtime.OurTime // Optional
completed_at ourtime.OurTime // Optional
description string
parent_type string // Optional: Can be 'Account', 'Contact', 'Lead', 'Opportunity', 'Case'
parent_id u32 // Optional: Reference to the parent entity
account_id u32 // Optional: Reference to Account
contact_id u32 // Optional: Reference to Contact
reminder_time ourtime.OurTime // Optional
// created_at ourtime.OurTime // Removed, provided by base.Base.creation_time
// updated_at ourtime.OurTime // Removed, provided by base.Base.mod_time
assigned_user_id u32 // Reference to User
created_by_id u32 // Reference to User
}

View File

@@ -0,0 +1,16 @@
module finance
import base
pub struct Account {
base.Base
pub mut:
name string // internal name of the account for the user
user_id u32 // user id of the owner of the account
description string // optional description of the account
ledger string // describes the ledger/blockchain where the account is located e.g. "ethereum", "bitcoin" or other institutions
address string // address of the account on the blockchain
pubkey string
assets []Asset
}

View File

@@ -0,0 +1,31 @@
module finance
import base
pub enum AssetType {
erc20
erc721
erc1155
native
}
pub struct Asset {
base.Base
pub mut:
name string
description string
amount f64
address string // address of the asset on the blockchain or bank
asset_type AssetType // type of the asset
decimals u8 // number of decimals of the asset
}
pub fn (self Asset) index_keys() map[string]string {
return {
'name': self.name
}
}
pub fn (self Asset) ftindex_keys() map[string]string {
return map[string]string{}
}

View File

@@ -0,0 +1,61 @@
module marketplace
import base
import freeflowuniverse.herolib.data.ourtime
import asset // For AssetType
// ListingStatus, ListingType enums and Bid struct are used from the same module
// Listing represents a marketplace listing for an asset
pub struct Listing {
base.Base // Provides id, created_at, updated_at
pub mut:
title string
description string
asset_id string
asset_type asset.AssetType // Enum from the asset model
seller_id string
price f64 // Initial price for fixed price, or starting price for auction
currency string
listing_type ListingType
status ListingStatus
expires_at ourtime.OurTime // Optional
sold_at ourtime.OurTime // Optional
buyer_id string // Optional
sale_price f64 // Optional
bids []Bid // List of bids for auction type listings
tags []string
image_url string // Optional
}
// ListingStatus defines the status of a marketplace listing
pub enum ListingStatus {
active
sold
cancelled
expired
}
// ListingType defines the type of marketplace listing
pub enum ListingType {
fixed_price
auction
exchange
}
// Bid represents a bid on an auction listing
pub struct Bid {
pub mut:
listing_id string // ID of the listing this bid belongs to
bidder_id u32
amount f64
currency string
status BidStatus
}
// BidStatus defines the status of a bid on an auction listing
pub enum BidStatus {
active
accepted
rejected
cancelled
}

View File

@@ -0,0 +1,59 @@
module flow
import base
import freeflowuniverse.herolib.data.ourtime
// enums from flow_enums.v and FlowStep from flow_step.v are used as they are in the same module
// Flow represents a complete workflow with multiple steps
pub struct Flow {
base.Base // For common fields like id, created_at, updated_at
pub mut:
name string
description string
flow_type string
status FlowStatus
current_step_id string // Optional: Based on Option<FlowStep> in Rust, storing just ID
progress_percentage u8
owner_id string
owner_name string
data string // Serialized JSON data (jsonb in Rust)
steps []FlowStep
// current_step is not directly mapped, as it's derived. current_step_id can be used.
}
// FlowStatus defines the overall status of a flow
pub enum FlowStatus {
in_progress
completed
stuck
cancelled
}
// FlowStep represents an individual step within a larger flow
pub struct FlowStep {
pub mut:
id string // UUID, from Uuid::new_v4().to_string()
name string
description string
status StepStatus
order u32
started_at ourtime.OurTime // Optional: Option<DateTime<Utc>>
completed_at ourtime.OurTime // Optional: Option<DateTime<Utc>>
logs []FlowLog
}
// StepStatus defines the status of an individual step within a flow
pub enum StepStatus {
pending
in_progress
completed
stuck
skipped
}
// FlowLog represents a log entry within a flow step
pub struct FlowLog {
pub mut:
timestamp ourtime.OurTime
message string
}

View File

@@ -0,0 +1,62 @@
module governance
import base
import freeflowuniverse.herolib.data.ourtime
// ProposalStatus enum is used from governance_enums.v in the same module
// Proposal represents a governance proposal that can be voted upon.
// It now incorporates the voting mechanism from biz/vote.v.
pub struct Proposal {
base.Base // Provides Proposal's own ID, created_at, updated_at
pub mut:
// Fields from original Proposal struct
creator_id string // User ID of the proposal creator
title string // Title of the proposal
description string // Detailed description of the proposal
status ProposalStatus // Status of the proposal lifecycle (draft, active, approved etc.)
// Fields from biz/vote.v's Vote struct (representing the voting event aspects of the proposal)
vote_start_date ourtime.OurTime // When voting on this proposal starts
vote_end_date ourtime.OurTime // When voting on this proposal ends
vote_status VoteEventStatus // Status of the voting event (open, closed, cancelled)
options []VoteOption // The choices users can vote for
ballots []Ballot // The cast votes by users
private_group []u32 // Optional: list of user IDs who are eligible to vote
}
// ProposalStatus defines the lifecycle status of a governance proposal itself
pub enum ProposalStatus {
draft // Proposal is being prepared
active // Proposal is active (might be pre-voting, during voting, or post-voting but not yet finalized)
approved // Proposal has been formally approved
rejected // Proposal has been formally rejected
cancelled// Proposal was cancelled
}
// -- Structures from biz/vote.v, adapted for integration --
// VoteEventStatus represents the status of the voting process for a proposal
// Renamed from VoteStatus in biz/vote.v to avoid confusion with ProposalStatus
pub enum VoteEventStatus {
open // Voting is currently open
closed // Voting has finished
cancelled // The voting event was cancelled
}
// VoteOption represents a specific choice that can be voted on within a proposal's voting event
pub struct VoteOption {
pub mut:
id u8 // Simple identifier for this option within this proposal's vote (e.g., 1, 2, 3)
text string // The descriptive text of the option (e.g., "Option A: Approve budget")
count int // How many votes this option has received
min_valid int // Optional: minimum votes needed for this option to be considered valid
}
// Ballot represents an individual vote cast by a user for a specific proposal
pub struct Ballot {
base.Base // Provides Ballot's own ID, created_at, updated_at
pub mut:
user_id u32 // The ID of the user who cast this ballot
vote_option_id u8 // The 'id' of the VoteOption chosen by the user
shares_count int // Number of shares/tokens/voting power used for this ballot
}

View File

@@ -0,0 +1,68 @@
module contract
import base
import freeflowuniverse.herolib.data.ourtime
// Contract represents a legal agreement
pub struct Contract {
base.Base // Base struct for common fields
pub mut:
id string // Unique ID for the contract (UUID string)
title string
description string
contract_type string // service, employment, nda, sla, partnership, distribution, license, membership, other
status ContractStatus
created_at ourtime.OurTime
updated_at ourtime.OurTime
created_by string // User ID or name of the creator
terms_and_conditions string // JSON string or markdown
start_date ourtime.OurTime // Optional
end_date ourtime.OurTime // Optional
renewal_period_days int // Optional (0 if not applicable)
next_renewal_date ourtime.OurTime // Optional
signers []ContractSigner
revisions []ContractRevision
current_version u32
last_signed_date ourtime.OurTime // Optional
}
// ContractRevision represents a version of the contract content
pub struct ContractRevision {
// base.Base // If applicable
pub mut:
version u32
content string // The actual content of the contract revision
created_at ourtime.OurTime
created_by string // User ID or name of the creator
comments string // Optional in Rust, string can be empty
}
// ContractStatus defines the possible statuses of a contract
pub enum ContractStatus {
draft
pending_signatures
signed
active
expired
cancelled
}
// ContractSigner represents a party involved in signing a contract
pub struct ContractSigner {
pub mut:
id string // Unique ID for the signer (UUID string)
name string
email string
status SignerStatus
signed_at ourtime.OurTime // Optional in Rust, OurTime can be zero
comments string // Optional in Rust, string can be empty
last_reminder_mail_sent_at ourtime.OurTime // Unix timestamp of last reminder sent
signature_data string // Base64 encoded signature image data (Optional in Rust)
}
// SignerStatus defines the status of a contract signer
pub enum SignerStatus {
pending
signed
rejected
}

View File

@@ -0,0 +1,284 @@
# MCC (Mail, Calendar, Contacts) Specification
This document outlines the data models for the MCC system, which is designed to be a self-hosted alternative to Google's Mail, Calendar, and Contacts services with full control over data.
## Overview
The MCC system consists of three main components:
1. **Mail**: A messaging system that can be used for email as well as chat
2. **Calendar**: A calendar system for managing events and appointments
3. **Contacts**: A contact management system
All components are integrated with the `circle.User` model, which serves as the primary user model for the system.
## Data Models
### User Model
The user model is defined in `circle/user.v` and has been enhanced with additional fields for MCC functionality:
```v
// User represents a member of a circle
pub struct User {
base.Base
pub mut:
name string // name of the member as used in this circle
description string // optional description which is relevant to this circle
role Role // role of the member in the circle
contact_ids []u32 // IDs of contacts linked to this member
wallet_ids []u32 // IDs of wallets owned by this member which are relevant to this circle
pubkey string // public key of the member as used in this circle
// Additional fields needed for MCC functionality
email string // Primary email address
timezone string // User's preferred timezone
preferences UserPreferences // User preferences for MCC
}
// UserPreferences represents user preferences for MCC
pub struct UserPreferences {
pub mut:
default_calendar_id u32 // Default calendar ID
default_view string // Default view (day, week, month)
email_signature string // Default email signature
theme string // UI theme preference
notifications bool // Enable/disable notifications
}
```
### Mail Models
The mail models are defined in `mcc/message.v`:
```v
// Message represents an email message
pub struct Message {
base.Base
pub mut:
id u32 // Database ID
message_id string // Unique identifier for the email
conversation_id string // ID for grouping messages in the same thread
folder string // The folder this email belongs to (inbox, sent, drafts, etc.)
labels []string // Google-style labels for organization
message string // The email body content
attachments []Attachment // Any file attachments
send_time ourtime.OurTime
date i64 // Unix timestamp when the email was sent/received
size u32 // Size of the message in bytes
read bool // Whether the email has been read
flagged bool // Whether the email has been flagged/starred
priority string // Priority level (high, normal, low)
// Header information
subject string
from []u32 // List of user IDs who sent the email
sender []u32
reply_to []u32
to []u32
cc []u32
bcc []u32
in_reply_to u32
// Additional fields
draft bool // Whether this is a draft message
scheduled_send ourtime.OurTime // Time to send if scheduled
}
// Attachment represents an email attachment
pub struct Attachment {
pub mut:
filename string
content_type string
hash string // Hash of the attachment data
size u32 // Size in bytes
content []byte // Optional, for storing small attachments directly
}
```
### Calendar Models
The calendar models are defined in `mcc/calendar.v`:
```v
// Calendar represents a collection of events
pub struct Calendar {
base.Base
pub mut:
name string // Name of the calendar
description string // Description of the calendar
color string // Color for the calendar
owner_id u32 // User who owns this calendar
timezone string // Default timezone for this calendar
visibility string // Public, private, etc.
shared_with []CalendarShare // Users this calendar is shared with
}
// CalendarShare represents calendar sharing permissions
pub struct CalendarShare {
pub mut:
user_id u32 // User ID this calendar is shared with
permission string // Read, write, owner, etc.
}
// CalendarEvent represents a calendar event with all its properties
pub struct CalendarEvent {
base.Base
pub mut:
calendar_id u32 // ID of the calendar this event belongs to
title string // Event title
description string // Event details
location string // Event location
start_time ourtime.OurTime
end_time ourtime.OurTime // End time
all_day bool // True if it's an all-day event
recurrence string // RFC 5545 Recurrence Rule (e.g., "FREQ=DAILY;COUNT=10")
attendees []Attendee // List of attendees
organizer u32 // The user who created the event
status string // "CONFIRMED", "CANCELLED", "TENTATIVE"
color string // User-friendly color categorization
reminders []Reminder // Reminders for this event
timezone string // Timezone for this specific event
visibility string // Public, private, etc.
attachments []Attachment // Attachments for this event
}
// Reminder represents a reminder for an event
pub struct Reminder {
pub mut:
event_id u32 // Event this reminder is for
time ourtime.OurTime // When to send the reminder
method string // How to deliver the reminder (email, notification, etc.)
}
// Attendee represents an attendee of an event
pub struct Attendee {
pub mut:
user_id u32 // User ID of the attendee
email string // Email of the attendee (for external attendees)
name string // Name of the attendee
response string // "ACCEPTED", "DECLINED", "TENTATIVE", "NEEDS-ACTION"
optional bool // Whether attendance is optional
comment string // Attendee's comment
}
```
### Contacts Models
The contacts models are defined in `mcc/contacts.v`:
```v
// Contact represents a contact with all their information
pub struct Contact {
base.Base
pub mut:
name string // Display name of the contact
first_name string
last_name string
nickname string
email []ContactEmail // Multiple email addresses with labels
phone []ContactPhone // Multiple phone numbers with labels
address []ContactAddress // Multiple addresses with labels
company string
job_title string
notes string
birthday ourtime.OurTime
website []string
social_profiles []SocialProfile
photo string // Path or URL to contact photo
groups []u32 // IDs of groups this contact belongs to
custom_fields []CustomField // User-defined fields
}
// ContactEmail represents an email address with a label
pub struct ContactEmail {
pub mut:
email string
label string // Home, Work, Other, etc.
primary bool
}
// ContactPhone represents a phone number with a label
pub struct ContactPhone {
pub mut:
number string
label string // Mobile, Home, Work, etc.
primary bool
}
// ContactAddress represents a physical address with a label
pub struct ContactAddress {
pub mut:
street string
city string
state string
postal_code string
country string
label string // Home, Work, Other, etc.
primary bool
}
// SocialProfile represents a social media profile
pub struct SocialProfile {
pub mut:
platform string // Facebook, Twitter, LinkedIn, etc.
username string
url string
}
// CustomField represents a user-defined field
pub struct CustomField {
pub mut:
label string
value string
}
// ContactGroup represents a group of contacts
pub struct ContactGroup {
base.Base
pub mut:
name string
description string
contacts []u32 // IDs of contacts in this group
owner_id u32 // User who owns this group
shared_with []u32 // Users this group is shared with
}
```
## Integration Points
The MCC system integrates with the existing system in the following ways:
1. **User Integration**:
- Uses `circle.User` as the primary user model
- The `biz.User` model has been deprecated and should not be used
2. **Cross-Component Integration**:
- Calendar events can reference contacts as attendees
- Emails can reference calendar events (for invitations)
- Contacts can be used in email addressing
3. **Base Integration**:
- All models extend the `base.Base` struct for common fields
- Consistent ID and timestamp handling
## System Architecture
```
+----------------+ +----------------+ +----------------+
| | | | | |
| Mail System |<----->| User System |<----->| Contact System |
| | | | | |
+----------------+ +----------------+ +----------------+
^ ^ ^
| | |
v v v
+----------------+ +----------------+ +----------------+
| | | | | |
| Calendar System|<----->| Base System |<----->| Group System |
| | | | | |
+----------------+ +----------------+ +----------------+
```
This specification provides a comprehensive data model for creating a self-hosted alternative to Google's Mail, Calendar, and Contacts services, with a focus on data ownership and control.

View File

@@ -0,0 +1,93 @@
module biz
import base
import freeflowuniverse.herolib.data.ourtime
// EventStatus represents the status of a calendar event
pub enum EventStatus {
confirmed
cancelled
tentative
}
// EventVisibility represents the visibility setting of a calendar event
pub enum EventVisibility {
public
private
confidential
}
// AttendeeResponse represents an attendee's response to an event invitation
pub enum AttendeeResponse {
accepted
declined
tentative
needs_action
}
// Calendar represents a collection of events
pub struct Calendar {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
name string // Name of the calendar
description string // Description of the calendar
color string // Color for the calendar
owner_id u32 // User who owns this calendar
timezone string // Default timezone for this calendar
visibility string // Public, private, etc.
shared_with []CalendarShare // Users this calendar is shared with
}
// CalendarShare represents calendar sharing permissions
pub struct CalendarShare {
pub mut:
user_id u32 // User ID this calendar is shared with
permission string // Read, write, owner, etc.
}
// CalendarEvent represents a calendar event with all its properties
pub struct CalendarEvent {
base.Base
pub mut:
calendar_id u32 // ID of the calendar this event belongs to
title string // Event title
description string // Event details
location string // Event location
start_time ourtime.OurTime
end_time ourtime.OurTime // End time
all_day bool // True if it's an all-day event
recurrence string // RFC 5545 Recurrence Rule (e.g., "FREQ=DAILY;COUNT=10")
attendees []Attendee // List of attendees
organizer u32 // The user (see circle) who created the event
status EventStatus // Status of the event
reminders []Reminder // Reminders for this event
timezone string // Timezone for this specific event
visibility EventVisibility // Visibility setting for the event
attachments []Attachment // Attachments for this event
}
// Reminder represents a reminder for an event
pub struct Reminder {
pub mut:
event_id u32 // Event this reminder is for
time ourtime.OurTime // When to send the reminder
method string // How to deliver the reminder (email, notification, etc.)
}
// Attendee represents an attendee of an event
pub struct Attendee {
pub mut:
contact_id u32 // User ID of the attendee
response AttendeeResponse // Attendee's response to the event invitation
optional bool // Whether attendance is optional
comment string // Attendee's comment
}
// Attachment represents an attachment for a calendar event
pub struct Attachment {
pub mut:
filename string
content_type string
hash string // Hash of the attachment data
size u32 // Size in bytes
}

View File

@@ -0,0 +1,111 @@
module biz
import base
import freeflowuniverse.herolib.data.ourtime
// ContactLabelType represents the type of label for contact information
pub enum ContactLabelType {
home
work
mobile
other
main
personal
business
school
custom // For user-defined labels
}
// SocialPlatformType represents the type of social media platform
pub enum SocialPlatformType {
facebook
twitter
linkedin
instagram
github
youtube
tiktok
reddit
pinterest
snapchat
whatsapp
telegram
discord
mastodon
other
}
// Contact represents a contact with all their information
pub struct Contact {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
name string // Display name of the contact
first_name string
last_name string
nickname string
email []ContactEmail // Multiple email addresses with labels
phone []ContactPhone // Multiple phone numbers with labels
address []ContactAddress // Multiple addresses with labels
company string
job_title string
notes string
birthday ourtime.OurTime
website []string
social_profiles []SocialProfile
photo u32 // link to the attachment in the circle
custom_fields []CustomField // User-defined fields
}
// ContactEmail represents an email address with a label
pub struct ContactEmail {
pub mut:
email string
label ContactLabelType // Type of email address
primary bool
}
// ContactPhone represents a phone number with a label
pub struct ContactPhone {
pub mut:
number string
label ContactLabelType // Type of phone number
primary bool
}
// ContactAddress represents a physical address with a label
pub struct ContactAddress {
pub mut:
street string
city string
state string
postal_code string
country string
label ContactLabelType // Type of address
primary bool
}
// SocialProfile represents a social media profile
pub struct SocialProfile {
pub mut:
platform SocialPlatformType // Type of social media platform
username string
url string
}
// CustomField represents a user-defined field
pub struct CustomField {
pub mut:
label string
value string
}
// ContactGroup represents a group of contacts
pub struct ContactGroup {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
name string
description string
contacts []u32 // IDs of contacts in this group
owner_id u32 // User who owns this group
shared_with []u32 // Users this group is shared with
}

View File

@@ -0,0 +1,40 @@
module biz
import base
import freeflowuniverse.herolib.data.ourtime
// MessagePriority represents the priority level of a message
pub enum MessagePriority {
low
normal
high
}
// Message represents an email message that can be used for email as well as chat
pub struct Message {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
// Database ID
conversation_id string // Grouping ID for messages in the same thread (not an entity foreign key)
folder string // The folder this email belongs to (e.g., inbox, sent, drafts)
labels []u16 // Numeric label codes, defined in 'message' circle configuration
message string // The email body content
attachments []u32 // List of Attachment.id references, stored in circle
send_time ourtime.OurTime
scheduled_send ourtime.OurTime // Time to send if scheduled
size u32 // Size of the message in bytes
read bool // Whether the email has been read
flagged bool // Whether the email has been flagged/starred
priority MessagePriority // Priority level
// Header information
subject string
from []u32 // List of User.id's who authored the message
sender []u32 // List of User.id's who sent the message (if different from 'from')
reply_to []u32 // List of User.id's to reply to
to []u32 // List of User.id's of primary recipients
cc []u32 // List of User.id's of CC recipients
bcc []u32 // List of User.id's of BCC recipients
in_reply_to_message_id u32? // Optional: Message.id of the message this is a reply to
draft bool // Whether this is a draft message
}

View File

@@ -0,0 +1,53 @@
module projects
import base
// Priority represents the priority level of a project item
pub enum Priority {
critical
high
medium
low
none
}
// Status represents the current status of a project item
pub enum Status {
todo
in_progress
review
done
archived
}
// ItemType represents the type of a project item
pub enum ItemType {
epic
story
task
bug
improvement
feature
}
// Project represents a project in the system
pub struct Project {
base.Base
pub mut:
name string
description string
owner_id u32 // ID of the user who owns this project
member_ids []u32 // IDs of the users who are members of this project
board_ids []u32 // IDs of the kanban boards in this project
sprint_ids []u32 // IDs of the sprints in this project
epic_ids []u32 // IDs of the epics in this project
tags []string
}
// Label represents a label that can be applied to project items
pub struct Label {
base.Base
pub mut:
name string
color string // Hex color code
}

View File

@@ -0,0 +1,37 @@
module projects
import base
// Epic represents a large body of work that can be broken down into stories
pub struct Epic {
base.Base
pub mut:
title string
description string
project_id u32 // ID of the project this epic belongs to
owner_id u32 // ID of the user who owns this epic
assignee_id u32 // ID of the user assigned to this epic
status Status
priority Priority
story_ids []u32 // IDs of the stories in this epic
issue_ids []u32 // IDs of the issues in this epic
label_ids []u32 // IDs of the labels applied to this epic
start_date string // Start date in ISO format
due_date string // Due date in ISO format
progress f32 // Progress as a percentage (0-100)
dependencies []u32 // IDs of epics that this epic depends on
blockers []string // List of blockers preventing progress
tags []string
}
// EpicProgress represents the progress of an epic
pub struct EpicProgress {
base.Base
pub mut:
epic_id u32
total_stories u32 // Total number of stories in the epic
completed_stories u32 // Number of completed stories
total_points f32 // Total number of story points
completed_points f32 // Number of completed story points
progress f32 // Progress as a percentage (0-100)
}

View File

@@ -0,0 +1,60 @@
module projects
import base
// IssueType represents the type of an issue
pub enum IssueType {
bug
feature_request
improvement
task
question
documentation
}
// IssueSeverity represents the severity of an issue
pub enum IssueSeverity {
blocker
critical
major
minor
trivial
}
// Issue represents a problem, task, or feature request in the project
pub struct Issue {
base.Base
pub mut:
title string
description string
project_id u32 // ID of the project this issue belongs to
reporter_id u32 // ID of the user who reported this issue
assignee_id u32 // ID of the user assigned to this issue
status Status
priority Priority
issue_type IssueType
severity IssueSeverity
epic_id u32 // ID of the epic this issue belongs to (if any)
story_id u32 // ID of the story this issue belongs to (if any)
sprint_id u32 // ID of the sprint this issue is scheduled for (if any)
label_ids []u32 // IDs of the labels applied to this issue
due_date string // Due date in ISO format
estimated_hours f32 // Estimated hours to complete
actual_hours f32 // Actual hours spent
dependencies []u32 // IDs of issues that this issue depends on
blockers []string // List of blockers preventing progress
steps_to_reproduce []string // Steps to reproduce (for bugs)
environment string // Environment where the issue occurs (for bugs)
attachments []string // Paths or references to attachments
tags []string
}
// IssueComment represents a comment on an issue
pub struct IssueComment {
base.Base
pub mut:
issue_id u32
author_id u32
content string
attachments []string // Paths or references to attachments
}

View File

@@ -0,0 +1,44 @@
module projects
import base
// KanbanBoard represents a kanban board in the project management system
pub struct KanbanBoard {
base.Base
pub mut:
name string
description string
project_id u32 // ID of the project this board belongs to
columns []Column // Columns in this kanban board
}
// Column represents a column in a kanban board
pub struct Column {
base.Base
pub mut:
name string
description string
position u32 // Position of the column in the board (for ordering)
item_ids []u32 // IDs of the items in this column
wip_limit u32 // Work in progress limit (0 means no limit)
}
// KanbanItem represents an item on a kanban board
// This can be linked to an Epic, Story, or Issue
pub struct KanbanItem {
base.Base
pub mut:
title string
description string
column_id u32 // ID of the column this item belongs to
position u32 // Position of the item in the column (for ordering)
assignee_id u32 // ID of the user assigned to this item
priority Priority
status Status
item_type ItemType
epic_id u32 // ID of the epic this item belongs to (if any)
story_id u32 // ID of the story this item belongs to (if any)
issue_id u32 // ID of the issue this item is linked to (if any)
label_ids []u32 // IDs of the labels applied to this item
due_date string // Due date in ISO format
}

View File

@@ -0,0 +1,45 @@
module projects
import base
// SprintStatus represents the status of a sprint
pub enum SprintStatus {
planning
active
review
completed
cancelled
}
// Sprint represents a time-boxed period in which specific work has to be completed
pub struct Sprint {
base.Base
pub mut:
name string
description string
project_id u32 // ID of the project this sprint belongs to
status SprintStatus
start_date string // Start date in ISO format
end_date string // End date in ISO format
goal string // The goal of this sprint
story_ids []u32 // IDs of the stories in this sprint
issue_ids []u32 // IDs of the issues in this sprint
epic_ids []u32 // IDs of the epics this sprint contributes to
velocity f32 // Planned velocity for this sprint
actual_points f32 // Actual story points completed
retrospective string // Notes from the sprint retrospective
}
// SprintReport represents a report generated at the end of a sprint
pub struct SprintReport {
base.Base
pub mut:
sprint_id u32
completed_items u32 // Number of items completed
total_items u32 // Total number of items
completed_points f32 // Number of story points completed
total_points f32 // Total number of story points
blockers []string // List of blockers encountered
achievements []string // List of achievements
lessons []string // Lessons learned
}

View File

@@ -0,0 +1,63 @@
module projects
import base
// StorySize represents the size/complexity of a user story
pub enum StorySize {
xs // 1 point
s // 2 points
m // 3 points
l // 5 points
xl // 8 points
xxl // 13 points
}
// AcceptanceCriteria represents a single acceptance criterion for a story
pub struct AcceptanceCriteria {
pub mut:
description string
satisfied bool
}
// Story represents a user story in the project management system
pub struct Story {
base.Base
pub mut:
title string
description string
project_id u32 // ID of the project this story belongs to
epic_id u32 // ID of the epic this story belongs to (if any)
sprint_id u32 // ID of the sprint this story is scheduled for (if any)
owner_id u32 // ID of the user who owns this story
assignee_id u32 // ID of the user assigned to this story
status Status
priority Priority
size StorySize
points f32 // Story points (if not using standard sizes)
acceptance_criteria []AcceptanceCriteria // List of acceptance criteria
issue_ids []u32 // IDs of the issues related to this story
label_ids []u32 // IDs of the labels applied to this story
dependencies []u32 // IDs of stories that this story depends on
blockers []string // List of blockers preventing progress
business_value u32 // Business value (1-10)
user_persona string // User persona this story relates to
start_date string // Start date in ISO format
due_date string // Due date in ISO format
estimated_hours f32 // Estimated hours to complete
actual_hours f32 // Actual hours spent
tags []string
}
// StoryTask represents a task that needs to be completed for a story
pub struct StoryTask {
base.Base
pub mut:
story_id u32
title string
description string
assignee_id u32 // ID of the user assigned to this task
status Status
estimated_hours f32 // Estimated hours to complete
actual_hours f32 // Actual hours spent
order u32 // Order of the task in the story
}

View File

@@ -0,0 +1,17 @@
module ticket
import base
import freeflowuniverse.herolib.data.ourtime
// TicketStatus and TicketPriority enums are used from ticket_enums.v in the same module
// Ticket represents a support ticket in the system
pub struct Ticket {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
user_id u32 // Reference to User.id (the user who created the ticket)
title string
description string
status TicketStatus
priority TicketPriority
assigned_to_user_id u32? // Optional: Reference to User.id (the user assigned to the ticket)
}

View File

@@ -0,0 +1,14 @@
module ticket
import base
import freeflowuniverse.herolib.data.ourtime
// TicketComment represents a comment on a support ticket
pub struct TicketComment {
base.Base // Provides id u32, creation_time, mod_time, comments []u32
pub mut:
ticket_id u32 // Reference to Ticket.id
user_id u32 // Reference to User.id (author of the comment)
content string
is_support_response bool // True if the comment is from a support agent
}

View File

@@ -0,0 +1,18 @@
module ticket
// TicketStatus defines the status of a support ticket
pub enum TicketStatus {
open
in_progress
waiting_for_customer
resolved
closed
}
// TicketPriority defines the priority of a support ticket
pub enum TicketPriority {
low
medium
high
critical
}

20
specs/modelsold/user.v Normal file
View File

@@ -0,0 +1,20 @@
module user
import base
import freeflowuniverse.herolib.data.ourtime
// UserRole represents the possible roles a user can have
pub enum UserRole {
user
admin
}
// User represents a user in the system
pub struct User {
base.Base // Base struct for common fields (id u32, creation_time, mod_time, comments []u32)
pub mut:
name string
email string
password_hash string // Hashed password
role UserRole
}