diff --git a/client/src/components/layouts/mobile-sidebar.tsx b/client/src/components/layouts/mobile-sidebar.tsx index 2ee8c01..cde6c2e 100644 --- a/client/src/components/layouts/mobile-sidebar.tsx +++ b/client/src/components/layouts/mobile-sidebar.tsx @@ -65,16 +65,16 @@ export function MobileSidebar({ isOpen, onClose }: MobileSidebarProps) { // Define admin navigation items const adminNavItems = [ { - title: "Users & Roles", + title: "Users", href: "/users-roles", icon: , roles: ["admin"], }, { - title: "Groups", - href: "/groups", - icon: , - roles: ["admin", "manager"], + title: "Roles", + href: "/roles", + icon: , + roles: ["admin"], }, { title: "Webhooks", diff --git a/client/src/components/layouts/sidebar.tsx b/client/src/components/layouts/sidebar.tsx index 20c25e0..4386d58 100644 --- a/client/src/components/layouts/sidebar.tsx +++ b/client/src/components/layouts/sidebar.tsx @@ -62,17 +62,11 @@ export function Sidebar() { // Define admin navigation items const adminNavItems = [ { - title: "Users & Roles", + title: "Users", href: "/users-roles", icon: , roles: ["admin"], }, - { - title: "Groups", - href: "/groups", - icon: , - roles: ["admin", "manager"], - }, { title: "Roles", href: "/roles", diff --git a/server/database-storage.ts b/server/database-storage.ts index 9baf933..876bbf5 100644 --- a/server/database-storage.ts +++ b/server/database-storage.ts @@ -1,7 +1,6 @@ import { users, organizations, domains, dnsRecords, providers, dnsHistory, apiTokens, webhooks, webhookDeliveryLogs, dnsMetrics, - groups, groupMembers, type User, type InsertUser, type Organization, type InsertOrganization, type Domain, type InsertDomain, @@ -10,9 +9,7 @@ import { type ApiToken, type InsertApiToken, type DnsHistory, type Webhook, type InsertWebhook, type WebhookDeliveryLog, type InsertWebhookDeliveryLog, - type DnsMetric, type InsertDnsMetric, - type Group, type InsertGroup, - type GroupMember, type InsertGroupMember + type DnsMetric, type InsertDnsMetric } from "@shared/schema"; import { db } from "./db"; import { eq, and, desc, or, inArray, sql } from "drizzle-orm"; @@ -95,49 +92,7 @@ export class DatabaseStorage implements IStorage { return result.length > 0; } - // Group management - async getGroup(id: string): Promise { - const [group] = await db.select().from(groups).where(eq(groups.id, id)); - return group; - } - - async getGroups(): Promise { - return await db.select().from(groups); - } - - async getGroupMembers(groupId: string): Promise { - return await db.select() - .from(groupMembers) - .where(eq(groupMembers.groupId, groupId)); - } - - async createGroup(group: InsertGroup): Promise { - const [newGroup] = await db.insert(groups).values(group).returning(); - return newGroup; - } - - async updateGroup(id: string, groupData: Partial): Promise { - const [updatedGroup] = await db.update(groups) - .set(groupData) - .where(eq(groups.id, id)) - .returning(); - return updatedGroup; - } - - async deleteGroup(id: string): Promise { - const result = await db.delete(groups).where(eq(groups.id, id)).returning(); - return result.length > 0; - } - - async addGroupMember(member: InsertGroupMember): Promise { - const [newMember] = await db.insert(groupMembers).values(member).returning(); - return newMember; - } - - async removeGroupMember(id: string): Promise { - const result = await db.delete(groupMembers).where(eq(groupMembers.id, id)).returning(); - return result.length > 0; - } + // Group management methods have been removed // Domain management async getDomain(id: string): Promise { diff --git a/server/routes.ts b/server/routes.ts index eef4c06..5695ed2 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -15,8 +15,6 @@ import { insertWebhookSchema, insertDnsMetricSchema, insertCustomRoleSchema, - insertGroupSchema, - insertGroupMemberSchema, recordTypes, providerTypes, customRoles, diff --git a/shared/schema.ts b/shared/schema.ts index dd42d12..6a7bd37 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -143,40 +143,7 @@ export const customRoles = pgTable("custom_roles", { createdBy: uuid("created_by").notNull().references(() => users.id, { onDelete: "set null" }), }); -// Groups can contain users, organizations, or other groups -export const groups = pgTable("groups", { - id: uuid("id").defaultRandom().primaryKey(), - name: text("name").notNull(), - description: text("description"), - isActive: boolean("is_active").default(true).notNull(), - createdAt: timestamp("created_at").defaultNow().notNull(), - createdBy: uuid("created_by").notNull().references(() => users.id, { onDelete: "set null" }), - parentGroupId: uuid("parent_group_id").references(() => groups.id, { onDelete: "set null" }), -}); - -// Group members - can be users, organizations, or other groups -export const groupMembers = pgTable("group_members", { - id: uuid("id").defaultRandom().primaryKey(), - groupId: uuid("group_id").notNull().references(() => groups.id, { onDelete: "cascade" }), - // Specify the type of member: "user", "organization", or "group" - memberType: text("member_type").notNull(), - // ID of the member (user, organization, or group) - memberId: uuid("member_id").notNull(), - addedAt: timestamp("added_at").defaultNow().notNull(), - addedBy: uuid("added_by").notNull().references(() => users.id, { onDelete: "set null" }), -}); - -// Group role assignments - associates groups with roles -export const groupRoles = pgTable("group_roles", { - id: uuid("id").defaultRandom().primaryKey(), - groupId: uuid("group_id").notNull().references(() => groups.id, { onDelete: "cascade" }), - // Can be either a system role (string) or a custom role ID (uuid) - roleId: text("role_id").notNull(), - // Indicates if this is a system role or a custom role - isSystemRole: boolean("is_system_role").notNull(), - assignedAt: timestamp("assigned_at").defaultNow().notNull(), - assignedBy: uuid("assigned_by").notNull().references(() => users.id, { onDelete: "set null" }), -}); +// Note: Groups, GroupMembers, and GroupRoles tables have been removed in this version // Schema Validation export const insertUserSchema = createInsertSchema(users).pick({ @@ -252,27 +219,7 @@ export const insertCustomRoleSchema = createInsertSchema(customRoles).pick({ createdBy: true, }); -export const insertGroupSchema = createInsertSchema(groups).pick({ - name: true, - description: true, - isActive: true, - createdBy: true, - parentGroupId: true, -}); - -export const insertGroupMemberSchema = createInsertSchema(groupMembers).pick({ - groupId: true, - memberType: true, - memberId: true, - addedBy: true, -}); - -export const insertGroupRoleSchema = createInsertSchema(groupRoles).pick({ - groupId: true, - roleId: true, - isSystemRole: true, - assignedBy: true, -}); +// Note: Group-related insert schemas have been removed in this version export const insertWebhookSchema = createInsertSchema(webhooks).pick({ name: true, @@ -331,14 +278,9 @@ export type ApiToken = typeof apiTokens.$inferSelect; export type DnsHistory = typeof dnsHistory.$inferSelect; export type DnsMetric = typeof dnsMetrics.$inferSelect; export type CustomRole = typeof customRoles.$inferSelect; -export type Group = typeof groups.$inferSelect; -export type GroupMember = typeof groupMembers.$inferSelect; -export type GroupRole = typeof groupRoles.$inferSelect; +// Note: Group-related types have been removed in this version export type InsertCustomRole = z.infer; -export type InsertGroup = z.infer; -export type InsertGroupMember = z.infer; -export type InsertGroupRole = z.infer; export type InsertWebhook = z.infer; export type Webhook = typeof webhooks.$inferSelect; export type InsertWebhookDeliveryLog = z.infer; @@ -353,8 +295,8 @@ export type SystemRole = typeof systemRoles[number]; // User roles can be system roles or custom roles export type UserRole = SystemRole | string; -// Define member types for group members -export const memberTypes = ['user', 'organization', 'group'] as const; +// Define member types (group type removed) +export const memberTypes = ['user', 'organization'] as const; export type MemberType = typeof memberTypes[number]; // Provider Types @@ -452,49 +394,11 @@ export const webhookDeliveryLogsRelations = relations(webhookDeliveryLogs, ({ on // Custom roles relations -export const customRolesRelations = relations(customRoles, ({ one, many }) => ({ +export const customRolesRelations = relations(customRoles, ({ one }) => ({ creator: one(users, { fields: [customRoles.createdBy], references: [users.id], }), - groupRoles: many(groupRoles), })); -// Group relations -export const groupsRelations = relations(groups, ({ one, many }) => ({ - creator: one(users, { - fields: [groups.createdBy], - references: [users.id], - }), - parentGroup: one(groups, { - fields: [groups.parentGroupId], - references: [groups.id], - relationName: "parentGroup", - }), - members: many(groupMembers), - roles: many(groupRoles), -})); - -// Group members relations -export const groupMembersRelations = relations(groupMembers, ({ one }) => ({ - group: one(groups, { - fields: [groupMembers.groupId], - references: [groups.id], - }), - addedByUser: one(users, { - fields: [groupMembers.addedBy], - references: [users.id], - }), -})); - -// Group roles relations -export const groupRolesRelations = relations(groupRoles, ({ one }) => ({ - group: one(groups, { - fields: [groupRoles.groupId], - references: [groups.id], - }), - assignedByUser: one(users, { - fields: [groupRoles.assignedBy], - references: [users.id], - }), -})); +// Note: Group-related relations have been removed in this version