forked from ryyst/kalzu-value-store
		
	refactor: extract all data structures to types/types.go
- Move 300+ lines of type definitions to types package - Update all type references throughout main.go - Extract all structs: StoredValue, User, Group, APIToken, etc. - Include all API request/response types - Move permission constants and configuration types - Maintain zero functional changes Reduced main.go from ~3990 to ~3650 lines 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		
							
								
								
									
										276
									
								
								types/types.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										276
									
								
								types/types.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,276 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import "encoding/json"
 | 
			
		||||
 | 
			
		||||
// Core data structures
 | 
			
		||||
type StoredValue struct {
 | 
			
		||||
	UUID      string          `json:"uuid"`
 | 
			
		||||
	Timestamp int64           `json:"timestamp"`
 | 
			
		||||
	Data      json.RawMessage `json:"data"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Phase 2: Authentication & Authorization data structures
 | 
			
		||||
 | 
			
		||||
// User represents a system user
 | 
			
		||||
type User struct {
 | 
			
		||||
	UUID         string   `json:"uuid"`         // Server-generated UUID
 | 
			
		||||
	NicknameHash string   `json:"nickname_hash"` // SHA3-512 hash of nickname
 | 
			
		||||
	Groups       []string `json:"groups"`       // List of group UUIDs this user belongs to
 | 
			
		||||
	CreatedAt    int64    `json:"created_at"`   // Unix timestamp
 | 
			
		||||
	UpdatedAt    int64    `json:"updated_at"`   // Unix timestamp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Group represents a user group
 | 
			
		||||
type Group struct {
 | 
			
		||||
	UUID        string   `json:"uuid"`        // Server-generated UUID
 | 
			
		||||
	NameHash    string   `json:"name_hash"`   // SHA3-512 hash of group name
 | 
			
		||||
	Members     []string `json:"members"`     // List of user UUIDs in this group
 | 
			
		||||
	CreatedAt   int64    `json:"created_at"`  // Unix timestamp
 | 
			
		||||
	UpdatedAt   int64    `json:"updated_at"`  // Unix timestamp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// APIToken represents a JWT authentication token
 | 
			
		||||
type APIToken struct {
 | 
			
		||||
	TokenHash string   `json:"token_hash"` // SHA3-512 hash of JWT token
 | 
			
		||||
	UserUUID  string   `json:"user_uuid"`  // UUID of the user who owns this token
 | 
			
		||||
	Scopes    []string `json:"scopes"`     // List of permitted scopes (e.g., "read", "write")
 | 
			
		||||
	IssuedAt  int64    `json:"issued_at"`  // Unix timestamp when token was issued
 | 
			
		||||
	ExpiresAt int64    `json:"expires_at"` // Unix timestamp when token expires
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResourceMetadata contains ownership and permission information for stored resources
 | 
			
		||||
type ResourceMetadata struct {
 | 
			
		||||
	OwnerUUID   string `json:"owner_uuid"`   // UUID of the resource owner
 | 
			
		||||
	GroupUUID   string `json:"group_uuid"`   // UUID of the resource group
 | 
			
		||||
	Permissions int    `json:"permissions"`  // 12-bit permission mask (POSIX-inspired)
 | 
			
		||||
	TTL         string `json:"ttl"`          // Time-to-live duration (Go format)
 | 
			
		||||
	CreatedAt   int64  `json:"created_at"`   // Unix timestamp when resource was created
 | 
			
		||||
	UpdatedAt   int64  `json:"updated_at"`   // Unix timestamp when resource was last updated
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Permission constants for POSIX-inspired ACL
 | 
			
		||||
const (
 | 
			
		||||
	// Owner permissions (bits 11-8)
 | 
			
		||||
	PermOwnerCreate = 1 << 11
 | 
			
		||||
	PermOwnerDelete = 1 << 10
 | 
			
		||||
	PermOwnerWrite  = 1 << 9
 | 
			
		||||
	PermOwnerRead   = 1 << 8
 | 
			
		||||
	
 | 
			
		||||
	// Group permissions (bits 7-4)
 | 
			
		||||
	PermGroupCreate = 1 << 7
 | 
			
		||||
	PermGroupDelete = 1 << 6
 | 
			
		||||
	PermGroupWrite  = 1 << 5
 | 
			
		||||
	PermGroupRead   = 1 << 4
 | 
			
		||||
	
 | 
			
		||||
	// Others permissions (bits 3-0)
 | 
			
		||||
	PermOthersCreate = 1 << 3
 | 
			
		||||
	PermOthersDelete = 1 << 2
 | 
			
		||||
	PermOthersWrite  = 1 << 1
 | 
			
		||||
	PermOthersRead   = 1 << 0
 | 
			
		||||
	
 | 
			
		||||
	// Default permissions: Owner(1111), Group(0110), Others(0010)
 | 
			
		||||
	DefaultPermissions = (PermOwnerCreate | PermOwnerDelete | PermOwnerWrite | PermOwnerRead) |
 | 
			
		||||
		(PermGroupWrite | PermGroupRead) |
 | 
			
		||||
		(PermOthersRead)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Phase 2: API request/response structures for authentication endpoints
 | 
			
		||||
 | 
			
		||||
// User Management API structures
 | 
			
		||||
type CreateUserRequest struct {
 | 
			
		||||
	Nickname string `json:"nickname"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type CreateUserResponse struct {
 | 
			
		||||
	UUID string `json:"uuid"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type UpdateUserRequest struct {
 | 
			
		||||
	Nickname string   `json:"nickname,omitempty"`
 | 
			
		||||
	Groups   []string `json:"groups,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type GetUserResponse struct {
 | 
			
		||||
	UUID         string   `json:"uuid"`
 | 
			
		||||
	NicknameHash string   `json:"nickname_hash"`
 | 
			
		||||
	Groups       []string `json:"groups"`
 | 
			
		||||
	CreatedAt    int64    `json:"created_at"`
 | 
			
		||||
	UpdatedAt    int64    `json:"updated_at"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Group Management API structures
 | 
			
		||||
type CreateGroupRequest struct {
 | 
			
		||||
	Groupname string   `json:"groupname"`
 | 
			
		||||
	Members   []string `json:"members,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type CreateGroupResponse struct {
 | 
			
		||||
	UUID string `json:"uuid"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type UpdateGroupRequest struct {
 | 
			
		||||
	Members []string `json:"members"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type GetGroupResponse struct {
 | 
			
		||||
	UUID      string   `json:"uuid"`
 | 
			
		||||
	NameHash  string   `json:"name_hash"`
 | 
			
		||||
	Members   []string `json:"members"`
 | 
			
		||||
	CreatedAt int64    `json:"created_at"`
 | 
			
		||||
	UpdatedAt int64    `json:"updated_at"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Token Management API structures
 | 
			
		||||
type CreateTokenRequest struct {
 | 
			
		||||
	UserUUID string   `json:"user_uuid"`
 | 
			
		||||
	Scopes   []string `json:"scopes"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type CreateTokenResponse struct {
 | 
			
		||||
	Token     string `json:"token"`
 | 
			
		||||
	ExpiresAt int64  `json:"expires_at"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Cluster and member management types
 | 
			
		||||
type Member struct {
 | 
			
		||||
	ID              string `json:"id"`
 | 
			
		||||
	Address         string `json:"address"`
 | 
			
		||||
	LastSeen        int64  `json:"last_seen"`
 | 
			
		||||
	JoinedTimestamp int64  `json:"joined_timestamp"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type JoinRequest struct {
 | 
			
		||||
	ID              string `json:"id"`
 | 
			
		||||
	Address         string `json:"address"`
 | 
			
		||||
	JoinedTimestamp int64  `json:"joined_timestamp"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type LeaveRequest struct {
 | 
			
		||||
	ID string `json:"id"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PairsByTimeRequest struct {
 | 
			
		||||
	StartTimestamp int64  `json:"start_timestamp"`
 | 
			
		||||
	EndTimestamp   int64  `json:"end_timestamp"`
 | 
			
		||||
	Limit          int    `json:"limit"`
 | 
			
		||||
	Prefix         string `json:"prefix,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PairsByTimeResponse struct {
 | 
			
		||||
	Path      string `json:"path"`
 | 
			
		||||
	UUID      string `json:"uuid"`
 | 
			
		||||
	Timestamp int64  `json:"timestamp"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PutResponse struct {
 | 
			
		||||
	UUID      string `json:"uuid"`
 | 
			
		||||
	Timestamp int64  `json:"timestamp"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Phase 2: TTL-enabled PUT request structure
 | 
			
		||||
type PutWithTTLRequest struct {
 | 
			
		||||
	Data json.RawMessage `json:"data"`
 | 
			
		||||
	TTL  string          `json:"ttl,omitempty"` // Go duration format
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Phase 2: Tamper-evident logging data structures
 | 
			
		||||
type TamperLogEntry struct {
 | 
			
		||||
	Timestamp string `json:"timestamp"` // RFC3339 format
 | 
			
		||||
	Action    string `json:"action"`    // Type of action
 | 
			
		||||
	UserUUID  string `json:"user_uuid"` // User who performed the action
 | 
			
		||||
	Resource  string `json:"resource"`  // Resource affected
 | 
			
		||||
	Signature string `json:"signature"` // SHA3-512 hash of all fields
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Phase 2: Backup system data structures
 | 
			
		||||
type BackupStatus struct {
 | 
			
		||||
	LastBackupTime    int64  `json:"last_backup_time"`    // Unix timestamp
 | 
			
		||||
	LastBackupSuccess bool   `json:"last_backup_success"` // Whether last backup succeeded
 | 
			
		||||
	LastBackupPath    string `json:"last_backup_path"`    // Path to last backup file
 | 
			
		||||
	NextBackupTime    int64  `json:"next_backup_time"`    // Unix timestamp of next scheduled backup
 | 
			
		||||
	BackupsRunning    int    `json:"backups_running"`     // Number of backups currently running
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Merkle Tree specific data structures
 | 
			
		||||
type MerkleNode struct {
 | 
			
		||||
	Hash     []byte `json:"hash"`
 | 
			
		||||
	StartKey string `json:"start_key"` // The first key in this node's range
 | 
			
		||||
	EndKey   string `json:"end_key"`   // The last key in this node's range
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MerkleRootResponse is the response for getting the root hash
 | 
			
		||||
type MerkleRootResponse struct {
 | 
			
		||||
	Root *MerkleNode `json:"root"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MerkleTreeDiffRequest is used to request children hashes for a given key range
 | 
			
		||||
type MerkleTreeDiffRequest struct {
 | 
			
		||||
	ParentNode MerkleNode `json:"parent_node"` // The node whose children we want to compare (from the remote peer's perspective)
 | 
			
		||||
	LocalHash  []byte     `json:"local_hash"`  // The local hash of this node/range (from the requesting peer's perspective)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MerkleTreeDiffResponse returns the remote children nodes or the actual keys if it's a leaf level
 | 
			
		||||
type MerkleTreeDiffResponse struct {
 | 
			
		||||
	Children []MerkleNode `json:"children,omitempty"` // Children of the remote node
 | 
			
		||||
	Keys     []string     `json:"keys,omitempty"`     // Actual keys if this is a leaf-level diff
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// For fetching a range of KV pairs
 | 
			
		||||
type KVRangeRequest struct {
 | 
			
		||||
	StartKey string `json:"start_key"`
 | 
			
		||||
	EndKey   string `json:"end_key"`
 | 
			
		||||
	Limit    int    `json:"limit"` // Max number of items to return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type KVRangeResponse struct {
 | 
			
		||||
	Pairs []struct {
 | 
			
		||||
		Path        string      `json:"path"`
 | 
			
		||||
		StoredValue StoredValue `json:"stored_value"`
 | 
			
		||||
	} `json:"pairs"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Configuration
 | 
			
		||||
type Config struct {
 | 
			
		||||
	NodeID             string   `yaml:"node_id"`
 | 
			
		||||
	BindAddress        string   `yaml:"bind_address"`
 | 
			
		||||
	Port               int      `yaml:"port"`
 | 
			
		||||
	DataDir            string   `yaml:"data_dir"`
 | 
			
		||||
	SeedNodes          []string `yaml:"seed_nodes"`
 | 
			
		||||
	ReadOnly           bool     `yaml:"read_only"`
 | 
			
		||||
	LogLevel           string   `yaml:"log_level"`
 | 
			
		||||
	GossipIntervalMin  int      `yaml:"gossip_interval_min"`
 | 
			
		||||
	GossipIntervalMax  int      `yaml:"gossip_interval_max"`
 | 
			
		||||
	SyncInterval       int      `yaml:"sync_interval"`
 | 
			
		||||
	CatchupInterval    int      `yaml:"catchup_interval"`
 | 
			
		||||
	BootstrapMaxAgeHours int    `yaml:"bootstrap_max_age_hours"`
 | 
			
		||||
	ThrottleDelayMs    int      `yaml:"throttle_delay_ms"`
 | 
			
		||||
	FetchDelayMs       int      `yaml:"fetch_delay_ms"`
 | 
			
		||||
	
 | 
			
		||||
	// Phase 2: Database compression configuration
 | 
			
		||||
	CompressionEnabled bool `yaml:"compression_enabled"`
 | 
			
		||||
	CompressionLevel   int  `yaml:"compression_level"`
 | 
			
		||||
	
 | 
			
		||||
	// Phase 2: TTL configuration
 | 
			
		||||
	DefaultTTL    string `yaml:"default_ttl"`      // Go duration format, "0" means no default TTL
 | 
			
		||||
	MaxJSONSize   int    `yaml:"max_json_size"`    // Maximum JSON size in bytes
 | 
			
		||||
	
 | 
			
		||||
	// Phase 2: Rate limiting configuration
 | 
			
		||||
	RateLimitRequests int    `yaml:"rate_limit_requests"` // Max requests per window
 | 
			
		||||
	RateLimitWindow   string `yaml:"rate_limit_window"`   // Window duration (Go format)
 | 
			
		||||
	
 | 
			
		||||
	// Phase 2: Tamper-evident logging configuration
 | 
			
		||||
	TamperLogActions []string `yaml:"tamper_log_actions"` // Actions to log
 | 
			
		||||
	
 | 
			
		||||
	// Phase 2: Backup system configuration
 | 
			
		||||
	BackupEnabled   bool   `yaml:"backup_enabled"`    // Enable/disable automated backups
 | 
			
		||||
	BackupSchedule  string `yaml:"backup_schedule"`   // Cron schedule format
 | 
			
		||||
	BackupPath      string `yaml:"backup_path"`       // Directory to store backups
 | 
			
		||||
	BackupRetention int    `yaml:"backup_retention"`  // Days to keep backups
 | 
			
		||||
	
 | 
			
		||||
	// Feature toggles for optional functionalities
 | 
			
		||||
	AuthEnabled            bool `yaml:"auth_enabled"`             // Enable/disable authentication system
 | 
			
		||||
	TamperLoggingEnabled   bool `yaml:"tamper_logging_enabled"`   // Enable/disable tamper-evident logging
 | 
			
		||||
	ClusteringEnabled      bool `yaml:"clustering_enabled"`       // Enable/disable clustering/gossip
 | 
			
		||||
	RateLimitingEnabled    bool `yaml:"rate_limiting_enabled"`    // Enable/disable rate limiting
 | 
			
		||||
	RevisionHistoryEnabled bool `yaml:"revision_history_enabled"` // Enable/disable revision history
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user