From 502045d3af22baf4480f368e3b6f8997796db3a6 Mon Sep 17 00:00:00 2001 From: mrhid6 Date: Tue, 21 Jul 2026 16:23:14 +0100 Subject: [PATCH] feat(models): add org/user/org_oidc models and org_id on scoped collections --- server/internal/models/assignment.go | 1 + server/internal/models/audit.go | 1 + server/internal/models/channel.go | 1 + server/internal/models/key.go | 1 + server/internal/models/monitor.go | 1 + server/internal/models/org.go | 15 +++++++++++++++ server/internal/models/org_oidc.go | 17 +++++++++++++++++ server/internal/models/secret.go | 1 + server/internal/models/server.go | 1 + server/internal/models/user.go | 19 +++++++++++++++++++ server/internal/models/workflow.go | 3 +++ 11 files changed, 61 insertions(+) create mode 100644 server/internal/models/org.go create mode 100644 server/internal/models/org_oidc.go create mode 100644 server/internal/models/user.go diff --git a/server/internal/models/assignment.go b/server/internal/models/assignment.go index 7320be1..6dc0135 100644 --- a/server/internal/models/assignment.go +++ b/server/internal/models/assignment.go @@ -8,6 +8,7 @@ import ( type Assignment struct { ID bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"` + OrgID string `bson:"org_id" json:"org_id"` KeyID string `bson:"key_id" json:"key_id"` ServerID string `bson:"server_id" json:"server_id"` AssignedAt time.Time `bson:"assigned_at" json:"assigned_at"` diff --git a/server/internal/models/audit.go b/server/internal/models/audit.go index 69f0c7e..61c55fe 100644 --- a/server/internal/models/audit.go +++ b/server/internal/models/audit.go @@ -8,6 +8,7 @@ import ( type AuditEvent struct { ID bson.ObjectID `bson:"_id,omitempty" json:"id"` + OrgID string `bson:"org_id" json:"org_id"` EventType string `bson:"event_type" json:"event_type"` Actor string `bson:"actor" json:"actor"` ServerID string `bson:"server_id,omitempty" json:"server_id,omitempty"` diff --git a/server/internal/models/channel.go b/server/internal/models/channel.go index c166cef..b6dcb0b 100644 --- a/server/internal/models/channel.go +++ b/server/internal/models/channel.go @@ -20,6 +20,7 @@ const ( // or telegram token/chat_id). type NotificationChannel struct { ID bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"` + OrgID string `bson:"org_id" json:"org_id"` ChannelID string `bson:"channel_id" json:"channel_id"` Name string `bson:"name" json:"name"` Type string `bson:"type" json:"type"` diff --git a/server/internal/models/key.go b/server/internal/models/key.go index 99ebdee..c2addaa 100644 --- a/server/internal/models/key.go +++ b/server/internal/models/key.go @@ -8,6 +8,7 @@ import ( type Key struct { ID bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"` + OrgID string `bson:"org_id" json:"org_id"` KeyID string `bson:"key_id" json:"key_id"` Label string `bson:"label" json:"label"` PublicKey string `bson:"public_key" json:"public_key"` diff --git a/server/internal/models/monitor.go b/server/internal/models/monitor.go index 472df32..97e9825 100644 --- a/server/internal/models/monitor.go +++ b/server/internal/models/monitor.go @@ -48,6 +48,7 @@ type MonitorState struct { type Monitor struct { ID bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"` + OrgID string `bson:"org_id" json:"org_id"` MonitorID string `bson:"monitor_id" json:"monitor_id"` Name string `bson:"name" json:"name"` Type string `bson:"type" json:"type"` // http|tcp|icmp|tls diff --git a/server/internal/models/org.go b/server/internal/models/org.go new file mode 100644 index 0000000..0a863a6 --- /dev/null +++ b/server/internal/models/org.go @@ -0,0 +1,15 @@ +package models + +import ( + "time" + + "go.mongodb.org/mongo-driver/v2/bson" +) + +type Org struct { + ID bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"` + OrgID string `bson:"org_id" json:"org_id"` + Name string `bson:"name" json:"name"` + Slug string `bson:"slug" json:"slug"` + CreatedAt time.Time `bson:"created_at" json:"created_at"` +} diff --git a/server/internal/models/org_oidc.go b/server/internal/models/org_oidc.go new file mode 100644 index 0000000..2f1d095 --- /dev/null +++ b/server/internal/models/org_oidc.go @@ -0,0 +1,17 @@ +package models + +import ( + "time" + + "go.mongodb.org/mongo-driver/v2/bson" +) + +type OrgOIDC struct { + ID bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"` + OrgID string `bson:"org_id" json:"org_id"` + Issuer string `bson:"issuer" json:"issuer"` + ClientID string `bson:"client_id" json:"client_id"` + ClientSecretEnc string `bson:"client_secret_enc,omitempty" json:"-"` + Enabled bool `bson:"enabled" json:"enabled"` + UpdatedAt time.Time `bson:"updated_at" json:"updated_at"` +} diff --git a/server/internal/models/secret.go b/server/internal/models/secret.go index 6557c3f..6af18c1 100644 --- a/server/internal/models/secret.go +++ b/server/internal/models/secret.go @@ -10,6 +10,7 @@ import ( // encrypted (AES-256-GCM) and is never serialized to JSON. type Secret struct { ID bson.ObjectID `bson:"_id,omitempty" json:"-"` + OrgID string `bson:"org_id" json:"org_id"` Group string `bson:"group" json:"group"` Key string `bson:"key" json:"key"` EncryptedValue string `bson:"encrypted_value" json:"-"` diff --git a/server/internal/models/server.go b/server/internal/models/server.go index 98dd7d5..6755cdc 100644 --- a/server/internal/models/server.go +++ b/server/internal/models/server.go @@ -45,6 +45,7 @@ type Inventory struct { type Server struct { ID bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"` + OrgID string `bson:"org_id" json:"org_id"` ServerID string `bson:"server_id" json:"server_id"` Hostname string `bson:"hostname" json:"hostname"` IPAddress string `bson:"ip_address" json:"ip_address"` diff --git a/server/internal/models/user.go b/server/internal/models/user.go new file mode 100644 index 0000000..0a8f624 --- /dev/null +++ b/server/internal/models/user.go @@ -0,0 +1,19 @@ +package models + +import ( + "time" + + "go.mongodb.org/mongo-driver/v2/bson" +) + +type User struct { + ID bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"` + UserID string `bson:"user_id" json:"user_id"` + OrgID string `bson:"org_id" json:"org_id"` + Email string `bson:"email" json:"email"` + PasswordHash string `bson:"password_hash,omitempty" json:"-"` + Role string `bson:"role" json:"role"` // owner|admin|member + AuthSource string `bson:"auth_source" json:"auth_source"` // local|oidc + CreatedAt time.Time `bson:"created_at" json:"created_at"` + LastLogin *time.Time `bson:"last_login,omitempty" json:"last_login,omitempty"` +} diff --git a/server/internal/models/workflow.go b/server/internal/models/workflow.go index 9880c56..7f4c525 100644 --- a/server/internal/models/workflow.go +++ b/server/internal/models/workflow.go @@ -14,6 +14,7 @@ type InputParam struct { type WorkflowStep struct { ID bson.ObjectID `bson:"_id,omitempty" json:"-"` + OrgID string `bson:"org_id" json:"org_id"` StepID string `bson:"step_id" json:"step_id"` Name string `bson:"name" json:"name"` Description string `bson:"description" json:"description"` @@ -45,6 +46,7 @@ type StepOverride struct { type Workflow struct { ID bson.ObjectID `bson:"_id,omitempty" json:"-"` + OrgID string `bson:"org_id" json:"org_id"` WorkflowID string `bson:"workflow_id" json:"workflow_id"` Name string `bson:"name" json:"name"` TargetServerIDs []string `bson:"target_server_ids" json:"target_server_ids"` @@ -89,6 +91,7 @@ type ServerRun struct { type WorkflowRun struct { ID bson.ObjectID `bson:"_id,omitempty" json:"-"` + OrgID string `bson:"org_id" json:"org_id"` RunID string `bson:"run_id" json:"run_id"` WorkflowID string `bson:"workflow_id" json:"workflow_id"` Name string `bson:"name" json:"name"`