task-b complate
This commit is contained in:
168
src/db/schema.ts
168
src/db/schema.ts
@@ -1,84 +1,130 @@
|
||||
import {
|
||||
boolean,
|
||||
doublePrecision,
|
||||
integer,
|
||||
jsonb,
|
||||
numeric,
|
||||
pgTable,
|
||||
text,
|
||||
timestamp,
|
||||
uniqueIndex,
|
||||
} from "drizzle-orm/pg-core";
|
||||
uniqueIndex
|
||||
} from 'drizzle-orm/pg-core';
|
||||
|
||||
export const users = pgTable(
|
||||
"users",
|
||||
'users',
|
||||
{
|
||||
id: text("id").primaryKey(),
|
||||
name: text("name").notNull(),
|
||||
email: text("email").notNull(),
|
||||
passwordHash: text("password_hash").notNull(),
|
||||
systemRole: text("system_role").default("user").notNull(),
|
||||
image: text("image"),
|
||||
activeOrganizationId: text("active_organization_id"),
|
||||
createdAt: timestamp("created_at", { withTimezone: true })
|
||||
.defaultNow()
|
||||
.notNull(),
|
||||
updatedAt: timestamp("updated_at", { withTimezone: true })
|
||||
.defaultNow()
|
||||
.notNull(),
|
||||
id: text('id').primaryKey(),
|
||||
name: text('name').notNull(),
|
||||
email: text('email').notNull(),
|
||||
passwordHash: text('password_hash').notNull(),
|
||||
systemRole: text('system_role').default('user').notNull(),
|
||||
image: text('image'),
|
||||
activeOrganizationId: text('active_organization_id'),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
||||
},
|
||||
(table) => ({
|
||||
emailIdx: uniqueIndex("users_email_idx").on(table.email),
|
||||
}),
|
||||
emailIdx: uniqueIndex('users_email_idx').on(table.email)
|
||||
})
|
||||
);
|
||||
|
||||
export const organizations = pgTable(
|
||||
"organizations",
|
||||
'organizations',
|
||||
{
|
||||
id: text("id").primaryKey(),
|
||||
name: text("name").notNull(),
|
||||
slug: text("slug").notNull(),
|
||||
imageUrl: text("image_url"),
|
||||
plan: text("plan").default("free").notNull(),
|
||||
createdBy: text("created_by").notNull(),
|
||||
createdAt: timestamp("created_at", { withTimezone: true })
|
||||
.defaultNow()
|
||||
.notNull(),
|
||||
updatedAt: timestamp("updated_at", { withTimezone: true })
|
||||
.defaultNow()
|
||||
.notNull(),
|
||||
id: text('id').primaryKey(),
|
||||
name: text('name').notNull(),
|
||||
slug: text('slug').notNull(),
|
||||
imageUrl: text('image_url'),
|
||||
plan: text('plan').default('free').notNull(),
|
||||
createdBy: text('created_by').notNull(),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
||||
},
|
||||
(table) => ({
|
||||
slugIdx: uniqueIndex("organizations_slug_idx").on(table.slug),
|
||||
}),
|
||||
slugIdx: uniqueIndex('organizations_slug_idx').on(table.slug)
|
||||
})
|
||||
);
|
||||
|
||||
export const memberships = pgTable("memberships", {
|
||||
id: text("id").primaryKey(),
|
||||
userId: text("user_id").notNull(),
|
||||
organizationId: text("organization_id").notNull(),
|
||||
role: text("role").default("user").notNull(),
|
||||
businessRole: text("business_role").default("viewer").notNull(),
|
||||
permissions: text("permissions").array().default([]).notNull(),
|
||||
createdAt: timestamp("created_at", { withTimezone: true })
|
||||
.defaultNow()
|
||||
.notNull(),
|
||||
updatedAt: timestamp("updated_at", { withTimezone: true })
|
||||
.defaultNow()
|
||||
.notNull(),
|
||||
export const memberships = pgTable('memberships', {
|
||||
id: text('id').primaryKey(),
|
||||
userId: text('user_id').notNull(),
|
||||
organizationId: text('organization_id').notNull(),
|
||||
role: text('role').default('user').notNull(),
|
||||
businessRole: text('business_role').default('viewer').notNull(),
|
||||
permissions: text('permissions').array().default([]).notNull(),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
||||
});
|
||||
|
||||
export const products = pgTable("products", {
|
||||
id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
|
||||
organizationId: text("organization_id").notNull(),
|
||||
name: text("name").notNull(),
|
||||
category: text("category").notNull(),
|
||||
description: text("description").notNull(),
|
||||
photoUrl: text("photo_url").notNull(),
|
||||
price: doublePrecision("price").notNull(),
|
||||
createdAt: timestamp("created_at", { withTimezone: true })
|
||||
.defaultNow()
|
||||
.notNull(),
|
||||
updatedAt: timestamp("updated_at", { withTimezone: true })
|
||||
.defaultNow()
|
||||
.notNull(),
|
||||
export const products = pgTable('products', {
|
||||
id: integer('id').primaryKey().generatedAlwaysAsIdentity(),
|
||||
organizationId: text('organization_id').notNull(),
|
||||
name: text('name').notNull(),
|
||||
category: text('category').notNull(),
|
||||
description: text('description').notNull(),
|
||||
photoUrl: text('photo_url').notNull(),
|
||||
price: doublePrecision('price').notNull(),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
||||
});
|
||||
|
||||
export const msOptions = pgTable(
|
||||
'ms_options',
|
||||
{
|
||||
id: text('id').primaryKey(),
|
||||
organizationId: text('organization_id').notNull(),
|
||||
category: text('category').notNull(),
|
||||
code: text('code').notNull(),
|
||||
label: text('label').notNull(),
|
||||
value: text('value'),
|
||||
parentId: text('parent_id'),
|
||||
sortOrder: integer('sort_order').default(0).notNull(),
|
||||
isActive: boolean('is_active').default(true).notNull(),
|
||||
metadata: jsonb('metadata'),
|
||||
deletedAt: timestamp('deleted_at', { withTimezone: true }),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
||||
},
|
||||
(table) => ({
|
||||
organizationCategoryCodeIdx: uniqueIndex('ms_options_org_category_code_idx').on(
|
||||
table.organizationId,
|
||||
table.category,
|
||||
table.code
|
||||
)
|
||||
})
|
||||
);
|
||||
|
||||
export const documentSequences = pgTable(
|
||||
'document_sequences',
|
||||
{
|
||||
id: text('id').primaryKey(),
|
||||
organizationId: text('organization_id').notNull(),
|
||||
branchId: text('branch_id').default('').notNull(),
|
||||
documentType: text('document_type').notNull(),
|
||||
prefix: text('prefix').notNull(),
|
||||
period: text('period').notNull(),
|
||||
currentNumber: integer('current_number').default(0).notNull(),
|
||||
paddingLength: integer('padding_length').default(3).notNull(),
|
||||
isActive: boolean('is_active').default(true).notNull(),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
|
||||
},
|
||||
(table) => ({
|
||||
organizationDocumentPeriodBranchIdx: uniqueIndex(
|
||||
'document_sequences_org_doc_period_branch_idx'
|
||||
).on(table.organizationId, table.documentType, table.period, table.branchId)
|
||||
})
|
||||
);
|
||||
|
||||
export const trAuditLogs = pgTable('tr_audit_logs', {
|
||||
id: text('id').primaryKey(),
|
||||
organizationId: text('organization_id').notNull(),
|
||||
branchId: text('branch_id'),
|
||||
userId: text('user_id').notNull(),
|
||||
entityType: text('entity_type').notNull(),
|
||||
entityId: text('entity_id').notNull(),
|
||||
action: text('action').notNull(),
|
||||
beforeData: jsonb('before_data'),
|
||||
afterData: jsonb('after_data'),
|
||||
requestId: text('request_id'),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull()
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user