Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 0 additions & 74 deletions taco/internal/query/common/org_indexes.go

This file was deleted.

7 changes: 3 additions & 4 deletions taco/internal/query/common/sql_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,9 @@ type SQLStore struct {
func NewSQLStore(db *gorm.DB) (*SQLStore, error) {
store := &SQLStore{db: db}

// Create org-scoped indexes (not handled by Atlas migrations)
if err := CreateOrgScopedIndexes(db); err != nil {
return nil, fmt.Errorf("failed to create org-scoped indexes: %w", err)
}
// All org-scoped unique indexes are now managed by Atlas migrations:
// - migrations/*/20251031000000_add_unique_unit_name_per_org.sql
// - migrations/*/20251031000001_add_unique_org_constraints.sql

// Create database views (not handled by Atlas migrations)
if err := store.createViews(); err != nil {
Expand Down
12 changes: 6 additions & 6 deletions taco/internal/query/types/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import (

type Role struct {
ID string `gorm:"type:varchar(36);primaryKey"`
OrgID string `gorm:"type:varchar(36);index"` // Foreign key to organizations.id (UUID)
Name string `gorm:"type:varchar(255);not null;index"` // Unique identifier (e.g., "admin", "viewer")
OrgID string `gorm:"type:varchar(36);index;uniqueIndex:unique_org_role_name"` // Foreign key to organizations.id (UUID)
Name string `gorm:"type:varchar(255);not null;index;uniqueIndex:unique_org_role_name"` // Unique identifier per org (e.g., "admin", "viewer")
Description string
Permissions []Permission `gorm:"many2many:role_permissions;constraint:OnDelete:CASCADE,OnUpdate:CASCADE"`
CreatedAt time.Time
Expand All @@ -27,8 +27,8 @@ func (Role) TableName() string { return "roles" }

type Permission struct {
ID string `gorm:"type:varchar(36);primaryKey"`
OrgID string `gorm:"type:varchar(36);index"` // Foreign key to organizations.id (UUID)
Name string `gorm:"type:varchar(255);not null;index"` // Unique identifier (e.g., "unit-read", "unit-write")
OrgID string `gorm:"type:varchar(36);index;uniqueIndex:unique_org_permission_name"` // Foreign key to organizations.id (UUID)
Name string `gorm:"type:varchar(255);not null;index;uniqueIndex:unique_org_permission_name"` // Unique identifier per org (e.g., "unit-read", "unit-write")
Description string
Rules []Rule `gorm:"constraint:OnDelete:CASCADE"`
CreatedBy string
Expand Down Expand Up @@ -163,8 +163,8 @@ func (Unit) TableName() string { return "units" }

type Tag struct {
ID string `gorm:"type:varchar(36);primaryKey"`
OrgID string `gorm:"type:varchar(36);index"` // Foreign key to organizations.id (UUID)
Name string `gorm:"type:varchar(255);not null;index"`
OrgID string `gorm:"type:varchar(36);index;uniqueIndex:unique_org_tag_name"` // Foreign key to organizations.id (UUID)
Name string `gorm:"type:varchar(255);not null;index;uniqueIndex:unique_org_tag_name"` // Unique per org
}

func (t *Tag) BeforeCreate(tx *gorm.DB) error {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- Add unique constraints on (org_id, name) for roles, permissions, and tags tables
-- This ensures names are unique within each organization

-- Create unique index on roles (org_id, name)
CREATE UNIQUE INDEX `unique_org_role_name` ON `roles` (`org_id`, `name`);

-- Create unique index on permissions (org_id, name)
CREATE UNIQUE INDEX `unique_org_permission_name` ON `permissions` (`org_id`, `name`);

-- Create unique index on tags (org_id, name)
CREATE UNIQUE INDEX `unique_org_tag_name` ON `tags` (`org_id`, `name`);

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- Add unique constraints on (org_id, name) for roles, permissions, and tags tables
-- This ensures names are unique within each organization

-- Create unique index on roles (org_id, name)
CREATE UNIQUE INDEX "unique_org_role_name" ON "public"."roles" ("org_id", "name");

-- Create unique index on permissions (org_id, name)
CREATE UNIQUE INDEX "unique_org_permission_name" ON "public"."permissions" ("org_id", "name");

-- Create unique index on tags (org_id, name)
CREATE UNIQUE INDEX "unique_org_tag_name" ON "public"."tags" ("org_id", "name");

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- Add unique constraints on (org_id, name) for roles, permissions, and tags tables
-- This ensures names are unique within each organization

-- Create unique index on roles (org_id, name)
CREATE UNIQUE INDEX `unique_org_role_name` ON `roles` (`org_id`, `name`);

-- Create unique index on permissions (org_id, name)
CREATE UNIQUE INDEX `unique_org_permission_name` ON `permissions` (`org_id`, `name`);

-- Create unique index on tags (org_id, name)
CREATE UNIQUE INDEX `unique_org_tag_name` ON `tags` (`org_id`, `name`);

Loading