feat(boc): v1.0 - Complete Business Operations Center
- Go backend API with full CRUD for all modules - Rust analytics service with parallel processing - C runtime with POSIX shared memory IPC - PostgreSQL schema with 30+ tables - Redis cache, Kafka event streaming - WebSocket hub, automation engine - PDF generation, Resend email integration - JWT auth, multi-tenant - Docker Compose deployment - Nginx reverse proxy Refs: BOC-001
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
package automation
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// UUID is a custom type for PostgreSQL UUID
|
||||
type UUID string
|
||||
|
||||
func (u UUID) String() string {
|
||||
return string(u)
|
||||
}
|
||||
|
||||
// Value implements the driver.Valuer interface
|
||||
func (u UUID) Value() (driver.Value, error) {
|
||||
return string(u), nil
|
||||
}
|
||||
|
||||
// Scan implements the sql.Scanner interface
|
||||
func (u *UUID) Scan(value interface{}) error {
|
||||
if value == nil {
|
||||
*u = ""
|
||||
return nil
|
||||
}
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
*u = UUID(v)
|
||||
case []byte:
|
||||
*u = UUID(string(v))
|
||||
default:
|
||||
return fmt.Errorf("cannot scan type %T into UUID", value)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// JSONMap is a map that can be stored as JSONB
|
||||
type JSONMap map[string]interface{}
|
||||
|
||||
// Value implements the driver.Valuer interface
|
||||
func (j JSONMap) Value() (driver.Value, error) {
|
||||
if j == nil {
|
||||
return []byte("{}"), nil
|
||||
}
|
||||
return json.Marshal(j)
|
||||
}
|
||||
|
||||
// Scan implements the sql.Scanner interface
|
||||
func (j *JSONMap) Scan(value interface{}) error {
|
||||
if value == nil {
|
||||
*j = JSONMap{}
|
||||
return nil
|
||||
}
|
||||
var bytes []byte
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
bytes = []byte(v)
|
||||
case []byte:
|
||||
bytes = v
|
||||
default:
|
||||
return fmt.Errorf("cannot scan type %T into JSONMap", value)
|
||||
}
|
||||
return json.Unmarshal(bytes, j)
|
||||
}
|
||||
|
||||
// ScheduledJob represents a scheduled automation job
|
||||
type ScheduledJob struct {
|
||||
ID UUID `json:"id"`
|
||||
TenantID UUID `json:"tenant_id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
CronExpr string `json:"cron_expr"`
|
||||
Timezone string `json:"timezone"`
|
||||
JobType string `json:"job_type"`
|
||||
JobConfig JSONMap `json:"job_config"`
|
||||
Status string `json:"status"`
|
||||
LastRunAt *time.Time `json:"last_run_at"`
|
||||
NextRunAt *time.Time `json:"next_run_at"`
|
||||
RunCount int `json:"run_count"`
|
||||
FailCount int `json:"fail_count"`
|
||||
CreatedBy *UUID `json:"created_by"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// Workflow represents an automation workflow
|
||||
type Workflow struct {
|
||||
ID UUID `json:"id"`
|
||||
TenantID UUID `json:"tenant_id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
TriggerType string `json:"trigger_type"`
|
||||
TriggerConfig JSONMap `json:"trigger_config"`
|
||||
Actions []JSONMap `json:"actions"`
|
||||
Status string `json:"status"`
|
||||
LastRunAt *time.Time `json:"last_run_at"`
|
||||
NextRunAt *time.Time `json:"next_run_at"`
|
||||
RunCount int `json:"run_count"`
|
||||
FailCount int `json:"fail_count"`
|
||||
CreatedBy *UUID `json:"created_by"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
Reference in New Issue
Block a user