@windrun-huaiin/diaomao 31.0.1 → 31.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/database/create.sql +176 -0
- package/database/init-schema.sql +66 -0
- package/next-env.d.ts +6 -0
- package/package.json +6 -3
- package/pnpm-workspace.yaml +9 -0
- package/prisma/schema.prisma +190 -0
- package/prisma.config.ts +11 -0
- package/src/generated/prisma/browser.ts +54 -0
- package/src/generated/prisma/client.ts +78 -0
- package/src/generated/prisma/commonInputTypes.ts +565 -0
- package/src/generated/prisma/enums.ts +15 -0
- package/src/generated/prisma/internal/class.ts +264 -0
- package/src/generated/prisma/internal/prismaNamespace.ts +1436 -0
- package/src/generated/prisma/internal/prismaNamespaceBrowser.ts +261 -0
- package/src/generated/prisma/models/Apilog.ts +1249 -0
- package/src/generated/prisma/models/Credit.ts +1727 -0
- package/src/generated/prisma/models/CreditAuditLog.ts +1541 -0
- package/src/generated/prisma/models/Subscription.ts +1615 -0
- package/src/generated/prisma/models/Transaction.ts +2403 -0
- package/src/generated/prisma/models/User.ts +1987 -0
- package/src/generated/prisma/models/UserBackup.ts +1389 -0
- package/src/generated/prisma/models.ts +18 -0
- package/src/mdx/blog/index.mdx +1 -1
- package/src/mdx/blog/ioc.mdx +1 -1
- package/turbo.json +120 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
-- USER
|
|
2
|
+
CREATE TABLE IF NOT EXISTS diaomao.users (
|
|
3
|
+
id BIGSERIAL PRIMARY KEY,
|
|
4
|
+
user_id UUID NOT NULL DEFAULT gen_random_uuid(),
|
|
5
|
+
status VARCHAR(50) NOT NULL DEFAULT 'anonymous',
|
|
6
|
+
fingerprint_id VARCHAR(255),
|
|
7
|
+
clerk_user_id VARCHAR(255),
|
|
8
|
+
stripe_cus_id VARCHAR(255),
|
|
9
|
+
email VARCHAR(255),
|
|
10
|
+
user_name VARCHAR(255),
|
|
11
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
12
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
source_ref JSONB,
|
|
14
|
+
CONSTRAINT users_user_id_key UNIQUE (user_id),
|
|
15
|
+
CONSTRAINT users_status_check CHECK (status::text = ANY (ARRAY['anonymous'::character varying, 'registered'::character varying, 'frozen'::character varying, 'deleted'::character varying]::text[]))
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE UNIQUE INDEX IF NOT EXISTS users_clerk_user_id_key
|
|
19
|
+
ON diaomao.users (clerk_user_id)
|
|
20
|
+
WHERE status <> 'deleted';
|
|
21
|
+
|
|
22
|
+
CREATE UNIQUE INDEX IF NOT EXISTS users_stripe_cus_id_key
|
|
23
|
+
ON diaomao.users (stripe_cus_id)
|
|
24
|
+
WHERE status <> 'deleted';
|
|
25
|
+
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_users_fingerprint_id ON diaomao.users (fingerprint_id);
|
|
27
|
+
|
|
28
|
+
-- SUBSCRIPTIONS
|
|
29
|
+
CREATE TABLE IF NOT EXISTS diaomao.subscriptions (
|
|
30
|
+
id BIGSERIAL PRIMARY KEY,
|
|
31
|
+
user_id UUID NOT NULL,
|
|
32
|
+
status VARCHAR(50) NOT NULL DEFAULT 'incomplete',
|
|
33
|
+
pay_subscription_id VARCHAR(255),
|
|
34
|
+
order_id VARCHAR(255),
|
|
35
|
+
price_id VARCHAR(255),
|
|
36
|
+
price_name VARCHAR(255),
|
|
37
|
+
credits_allocated INTEGER NOT NULL DEFAULT 0,
|
|
38
|
+
sub_period_start TIMESTAMPTZ,
|
|
39
|
+
sub_period_end TIMESTAMPTZ,
|
|
40
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
41
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
42
|
+
deleted INTEGER NOT NULL DEFAULT 0,
|
|
43
|
+
CONSTRAINT subscriptions_user_id_key UNIQUE (user_id),
|
|
44
|
+
CONSTRAINT subscriptions_status_check CHECK (status::text = ANY (ARRAY['active'::character varying, 'canceled'::character varying, 'past_due'::character varying, 'incomplete'::character varying, 'trialing'::character varying]::text[])),
|
|
45
|
+
CONSTRAINT transactions_deleted_check CHECK (deleted = ANY (ARRAY[0, 1]))
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_subscriptions_pay_subscription_id ON diaomao.subscriptions (pay_subscription_id);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_subscriptions_order_id ON diaomao.subscriptions (order_id);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_subscriptions_user_id ON diaomao.subscriptions (user_id);
|
|
51
|
+
|
|
52
|
+
-- CREDITS
|
|
53
|
+
CREATE TABLE IF NOT EXISTS diaomao.credits (
|
|
54
|
+
id BIGSERIAL PRIMARY KEY,
|
|
55
|
+
user_id UUID NOT NULL,
|
|
56
|
+
balance_free INTEGER NOT NULL DEFAULT 0,
|
|
57
|
+
total_free_limit INTEGER NOT NULL DEFAULT 0,
|
|
58
|
+
free_start TIMESTAMPTZ,
|
|
59
|
+
free_end TIMESTAMPTZ,
|
|
60
|
+
balance_paid INTEGER NOT NULL DEFAULT 0,
|
|
61
|
+
total_paid_limit INTEGER NOT NULL DEFAULT 0,
|
|
62
|
+
paid_start TIMESTAMPTZ,
|
|
63
|
+
paid_end TIMESTAMPTZ,
|
|
64
|
+
balance_onetime_paid INTEGER NOT NULL DEFAULT 0,
|
|
65
|
+
total_onetime_paid_limit INTEGER NOT NULL DEFAULT 0,
|
|
66
|
+
onetime_paid_start TIMESTAMPTZ,
|
|
67
|
+
onetime_paid_end TIMESTAMPTZ,
|
|
68
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
69
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
70
|
+
CONSTRAINT credits_user_id_key UNIQUE (user_id)
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_credits_user_id ON diaomao.credits (user_id);
|
|
74
|
+
|
|
75
|
+
-- ORDER
|
|
76
|
+
CREATE TABLE IF NOT EXISTS diaomao.transactions (
|
|
77
|
+
id BIGSERIAL PRIMARY KEY,
|
|
78
|
+
user_id UUID NOT NULL,
|
|
79
|
+
order_id VARCHAR(255) NOT NULL,
|
|
80
|
+
order_status VARCHAR(50) NOT NULL DEFAULT 'created',
|
|
81
|
+
order_created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
82
|
+
order_expired_at TIMESTAMPTZ,
|
|
83
|
+
order_updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
84
|
+
type VARCHAR(50),
|
|
85
|
+
pay_supplier VARCHAR(255),
|
|
86
|
+
pay_session_id VARCHAR(255),
|
|
87
|
+
pay_transaction_id VARCHAR(255),
|
|
88
|
+
pay_subscription_id VARCHAR(255),
|
|
89
|
+
sub_period_start TIMESTAMPTZ,
|
|
90
|
+
sub_period_end TIMESTAMPTZ,
|
|
91
|
+
sub_last_try_cancel_at TIMESTAMPTZ,
|
|
92
|
+
sub_period_canceled_at TIMESTAMPTZ,
|
|
93
|
+
sub_cancellation_detail TEXT,
|
|
94
|
+
price_id VARCHAR(255),
|
|
95
|
+
price_name VARCHAR(255),
|
|
96
|
+
amount NUMERIC(10, 2),
|
|
97
|
+
currency VARCHAR(50),
|
|
98
|
+
credits_granted INTEGER NOT NULL DEFAULT 0,
|
|
99
|
+
pay_invoice_id VARCHAR(255),
|
|
100
|
+
payment_status VARCHAR(50) NOT NULL DEFAULT 'un_paid',
|
|
101
|
+
billing_reason VARCHAR(100),
|
|
102
|
+
hosted_invoice_url TEXT,
|
|
103
|
+
invoice_pdf TEXT,
|
|
104
|
+
order_detail TEXT,
|
|
105
|
+
paid_email VARCHAR(255),
|
|
106
|
+
paid_at TIMESTAMPTZ,
|
|
107
|
+
paid_detail TEXT,
|
|
108
|
+
pay_updated_at TIMESTAMPTZ,
|
|
109
|
+
deleted INTEGER NOT NULL DEFAULT 0,
|
|
110
|
+
CONSTRAINT transactions_order_id_key UNIQUE (order_id),
|
|
111
|
+
CONSTRAINT transactions_pay_transaction_id_key UNIQUE (pay_transaction_id),
|
|
112
|
+
CONSTRAINT transactions_order_status_check CHECK (order_status::text = ANY (ARRAY['created'::character varying, 'pending_unpaid'::character varying, 'success'::character varying, 'refunded'::character varying, 'canceled'::character varying, 'failed'::character varying]::text[])),
|
|
113
|
+
CONSTRAINT transactions_pay_supplier_check CHECK (pay_supplier::text = ANY (ARRAY['Stripe'::character varying, 'Apple'::character varying, 'Paypal'::character varying]::text[])),
|
|
114
|
+
CONSTRAINT transactions_type_check CHECK (type::text = ANY (ARRAY['subscription'::character varying, 'one_time'::character varying]::text[])),
|
|
115
|
+
CONSTRAINT transactions_payment_status_check CHECK (payment_status::text = ANY (ARRAY['un_paid'::character varying, 'paid'::character varying, 'no_payment_required'::character varying]::text[])),
|
|
116
|
+
CONSTRAINT transactions_deleted_check CHECK (deleted = ANY (ARRAY[0, 1]))
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
CREATE INDEX IF NOT EXISTS idx_transactions_order_id ON diaomao.transactions (order_id);
|
|
120
|
+
CREATE INDEX IF NOT EXISTS idx_transactions_pay_subscription_id ON diaomao.transactions (pay_subscription_id);
|
|
121
|
+
CREATE INDEX IF NOT EXISTS idx_transactions_user_id ON diaomao.transactions (user_id);
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
-- AUDIT_LOG
|
|
125
|
+
CREATE TABLE IF NOT EXISTS diaomao.credit_audit_log (
|
|
126
|
+
id BIGSERIAL PRIMARY KEY,
|
|
127
|
+
user_id UUID NOT NULL,
|
|
128
|
+
credits_change INTEGER NOT NULL,
|
|
129
|
+
feature VARCHAR(255),
|
|
130
|
+
credit_type VARCHAR(50) NOT NULL,
|
|
131
|
+
operation_type VARCHAR(100) NOT NULL,
|
|
132
|
+
operation_refer_id VARCHAR(255),
|
|
133
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
134
|
+
deleted INTEGER NOT NULL DEFAULT 0,
|
|
135
|
+
CONSTRAINT credit_audit_log_deleted_check CHECK (deleted = ANY (ARRAY[0, 1]))
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
CREATE INDEX IF NOT EXISTS idx_credit_audit_log_credit_type ON diaomao.credit_audit_log (credit_type);
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_credit_audit_log_operation_type ON diaomao.credit_audit_log (operation_type);
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_credit_audit_log_user_id ON diaomao.credit_audit_log (user_id);
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
-- USER_BACKUP
|
|
144
|
+
CREATE TABLE IF NOT EXISTS diaomao.user_backup (
|
|
145
|
+
id BIGSERIAL PRIMARY KEY,
|
|
146
|
+
original_user_id UUID NOT NULL,
|
|
147
|
+
status VARCHAR(50),
|
|
148
|
+
fingerprint_id VARCHAR(255),
|
|
149
|
+
clerk_user_id VARCHAR(255),
|
|
150
|
+
stripe_cus_id VARCHAR(255),
|
|
151
|
+
email VARCHAR(255),
|
|
152
|
+
user_name VARCHAR(255),
|
|
153
|
+
backup_data JSONB,
|
|
154
|
+
deleted_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
155
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
156
|
+
deleted INTEGER NOT NULL DEFAULT 0,
|
|
157
|
+
CONSTRAINT user_backup_deleted_check CHECK (deleted = ANY (ARRAY[0, 1]))
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
CREATE INDEX IF NOT EXISTS idx_user_backup_clerk_user_id ON diaomao.user_backup (clerk_user_id);
|
|
161
|
+
CREATE INDEX IF NOT EXISTS idx_user_backup_email ON diaomao.user_backup (email);
|
|
162
|
+
CREATE INDEX IF NOT EXISTS idx_user_backup_fingerprint_id ON diaomao.user_backup (fingerprint_id);
|
|
163
|
+
CREATE INDEX IF NOT EXISTS idx_user_backup_original_user_id ON diaomao.user_backup (original_user_id);
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
-- API_LOG
|
|
167
|
+
CREATE TABLE IF NOT EXISTS diaomao.apilog (
|
|
168
|
+
id BIGSERIAL PRIMARY KEY,
|
|
169
|
+
api_type VARCHAR(100) NOT NULL,
|
|
170
|
+
method_name VARCHAR(255) NOT NULL,
|
|
171
|
+
summary TEXT,
|
|
172
|
+
request TEXT,
|
|
173
|
+
response TEXT,
|
|
174
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|
175
|
+
);
|
|
176
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
-- diaomao schema init
|
|
2
|
+
-- Usage Scenarios:
|
|
3
|
+
-- 1. Supabase hosted PostgreSQL
|
|
4
|
+
-- 2. Prisma direct database connection
|
|
5
|
+
-- 3. Multiple projects sharing the same database, isolated by schema
|
|
6
|
+
--
|
|
7
|
+
-- Notes:
|
|
8
|
+
-- 1. Use diaomao_app for runtime connections; do NOT use postgres
|
|
9
|
+
-- 2. schema=diaomao is the default namespace only, NOT a security boundary
|
|
10
|
+
-- 3. Permission isolation relies on granting diaomao_app minimal privileges to the diaomao schema
|
|
11
|
+
|
|
12
|
+
-- Dangerous operation, keep commented; do NOT execute in shared environments by default
|
|
13
|
+
-- DROP SCHEMA IF EXISTS diaomao CASCADE;
|
|
14
|
+
|
|
15
|
+
-- Step 1: Create schema (safe to run repeatedly)
|
|
16
|
+
CREATE SCHEMA IF NOT EXISTS diaomao;
|
|
17
|
+
|
|
18
|
+
-- Step 2: Assign schema ownership to postgres
|
|
19
|
+
ALTER SCHEMA diaomao OWNER TO postgres;
|
|
20
|
+
|
|
21
|
+
-- Step 3: Revoke broad privileges from PUBLIC and Supabase shared roles
|
|
22
|
+
REVOKE ALL ON SCHEMA diaomao FROM PUBLIC;
|
|
23
|
+
REVOKE ALL ON SCHEMA diaomao FROM anon, authenticated, service_role;
|
|
24
|
+
REVOKE ALL ON ALL TABLES IN SCHEMA diaomao FROM PUBLIC;
|
|
25
|
+
REVOKE ALL ON ALL TABLES IN SCHEMA diaomao FROM anon, authenticated, service_role;
|
|
26
|
+
REVOKE ALL ON ALL SEQUENCES IN SCHEMA diaomao FROM PUBLIC;
|
|
27
|
+
REVOKE ALL ON ALL SEQUENCES IN SCHEMA diaomao FROM anon, authenticated, service_role;
|
|
28
|
+
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA diaomao FROM PUBLIC;
|
|
29
|
+
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA diaomao FROM anon, authenticated, service_role;
|
|
30
|
+
|
|
31
|
+
-- Step 4: Create application role; set a strong password manually
|
|
32
|
+
DO $$
|
|
33
|
+
BEGIN
|
|
34
|
+
IF NOT EXISTS (
|
|
35
|
+
SELECT 1 FROM pg_roles WHERE rolname = 'diaomao_app'
|
|
36
|
+
) THEN
|
|
37
|
+
CREATE ROLE diaomao_app
|
|
38
|
+
LOGIN
|
|
39
|
+
PASSWORD 'YOURS_PASSWORD';
|
|
40
|
+
END IF;
|
|
41
|
+
END
|
|
42
|
+
$$;
|
|
43
|
+
|
|
44
|
+
-- Step 5: Grant database connection permission to the application role
|
|
45
|
+
GRANT CONNECT ON DATABASE postgres TO diaomao_app;
|
|
46
|
+
|
|
47
|
+
-- Step 6: Allow the application role to use the diaomao schema only (no CREATE privilege)
|
|
48
|
+
GRANT USAGE ON SCHEMA diaomao TO diaomao_app;
|
|
49
|
+
|
|
50
|
+
-- Step 7: Grant minimal required permissions for existing objects to diaomao_app
|
|
51
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA diaomao TO diaomao_app;
|
|
52
|
+
GRANT USAGE, SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA diaomao TO diaomao_app;
|
|
53
|
+
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA diaomao TO diaomao_app;
|
|
54
|
+
|
|
55
|
+
-- Step 8: Configure default privileges to auto-grant access for new objects created by postgres
|
|
56
|
+
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA diaomao
|
|
57
|
+
REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
|
|
58
|
+
|
|
59
|
+
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA diaomao
|
|
60
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO diaomao_app;
|
|
61
|
+
|
|
62
|
+
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA diaomao
|
|
63
|
+
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO diaomao_app;
|
|
64
|
+
|
|
65
|
+
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA diaomao
|
|
66
|
+
GRANT EXECUTE ON FUNCTIONS TO diaomao_app;
|
package/next-env.d.ts
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@windrun-huaiin/diaomao",
|
|
3
|
-
"version": "31.
|
|
3
|
+
"version": "31.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -59,9 +59,10 @@
|
|
|
59
59
|
"files": [
|
|
60
60
|
".changeset",
|
|
61
61
|
"!.changeset/d8-template.mdx",
|
|
62
|
-
"patches",
|
|
63
62
|
"src",
|
|
64
63
|
"public",
|
|
64
|
+
"database",
|
|
65
|
+
"prisma",
|
|
65
66
|
".gitignore",
|
|
66
67
|
"messages",
|
|
67
68
|
".env.local.txt",
|
|
@@ -71,11 +72,13 @@
|
|
|
71
72
|
"LICENSE",
|
|
72
73
|
"next-env.d.ts",
|
|
73
74
|
"next.config.ts",
|
|
75
|
+
"prisma.config.ts",
|
|
76
|
+
"pnpm-workspace.yaml",
|
|
74
77
|
"postcss.config.mjs",
|
|
75
|
-
"tailwind.config.ts",
|
|
76
78
|
"source.config.ts",
|
|
77
79
|
"tsconfig.json",
|
|
78
80
|
"tsconfig.node.json",
|
|
81
|
+
"turbo.json",
|
|
79
82
|
"!**/scripts/**",
|
|
80
83
|
"!**/*.test.{js,ts}",
|
|
81
84
|
"!**/*.log"
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
generator client {
|
|
2
|
+
provider = "prisma-client"
|
|
3
|
+
output = "../src/generated/prisma"
|
|
4
|
+
engineType = "client"
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
datasource db {
|
|
8
|
+
provider = "postgresql"
|
|
9
|
+
schemas = ["diaomao", "public"]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// === backend-core models ===
|
|
13
|
+
model User {
|
|
14
|
+
id BigInt @id @default(autoincrement())
|
|
15
|
+
userId String @unique @default(dbgenerated("gen_random_uuid()")) @map("user_id") @db.Uuid
|
|
16
|
+
status String @default("anonymous") @db.VarChar(50)
|
|
17
|
+
fingerprintId String? @map("fingerprint_id") @db.VarChar(255)
|
|
18
|
+
clerkUserId String? @unique @map("clerk_user_id") @db.VarChar(255)
|
|
19
|
+
stripeCusId String? @unique @map("stripe_cus_id") @db.VarChar(255)
|
|
20
|
+
email String? @db.VarChar(255)
|
|
21
|
+
userName String? @map("user_name") @db.VarChar(255)
|
|
22
|
+
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
|
23
|
+
updatedAt DateTime? @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
|
|
24
|
+
sourceRef Json? @map("source_ref")
|
|
25
|
+
creditAuditLogs CreditAuditLog[]
|
|
26
|
+
credit Credit?
|
|
27
|
+
subscription Subscription?
|
|
28
|
+
transactions Transaction[]
|
|
29
|
+
|
|
30
|
+
@@index([fingerprintId], map: "idx_users_fingerprint_id")
|
|
31
|
+
@@map("users")
|
|
32
|
+
|
|
33
|
+
@@schema("diaomao")
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
model Subscription {
|
|
37
|
+
id BigInt @id @default(autoincrement())
|
|
38
|
+
userId String @unique @map("user_id") @db.Uuid
|
|
39
|
+
status String @default("incomplete") @db.VarChar(50)
|
|
40
|
+
paySubscriptionId String? @map("pay_subscription_id") @db.VarChar(255)
|
|
41
|
+
orderId String? @map("order_id") @db.VarChar(255)
|
|
42
|
+
priceId String? @map("price_id") @db.VarChar(255)
|
|
43
|
+
priceName String? @map("price_name") @db.VarChar(255)
|
|
44
|
+
creditsAllocated Int @default(0) @map("credits_allocated")
|
|
45
|
+
subPeriodStart DateTime? @map("sub_period_start") @db.Timestamptz(6)
|
|
46
|
+
subPeriodEnd DateTime? @map("sub_period_end") @db.Timestamptz(6)
|
|
47
|
+
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
|
48
|
+
updatedAt DateTime? @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
|
|
49
|
+
deleted Int @default(0)
|
|
50
|
+
user User @relation(fields: [userId], references: [userId], onDelete: NoAction, onUpdate: NoAction)
|
|
51
|
+
|
|
52
|
+
@@index([paySubscriptionId], map: "idx_subscriptions_pay_subscription_id")
|
|
53
|
+
@@index([orderId], map: "idx_subscriptions_order_id")
|
|
54
|
+
@@map("subscriptions")
|
|
55
|
+
|
|
56
|
+
@@schema("diaomao")
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
model Credit {
|
|
60
|
+
id BigInt @id @default(autoincrement())
|
|
61
|
+
userId String @unique @map("user_id") @db.Uuid
|
|
62
|
+
|
|
63
|
+
// ===== Free =====
|
|
64
|
+
balanceFree Int @default(0) @map("balance_free")
|
|
65
|
+
totalFreeLimit Int @default(0) @map("total_free_limit")
|
|
66
|
+
freeStart DateTime? @map("free_start") @db.Timestamptz(6)
|
|
67
|
+
freeEnd DateTime? @map("free_end") @db.Timestamptz(6)
|
|
68
|
+
|
|
69
|
+
// ===== Subscription =====
|
|
70
|
+
balancePaid Int @default(0) @map("balance_paid")
|
|
71
|
+
totalPaidLimit Int @default(0) @map("total_paid_limit")
|
|
72
|
+
paidStart DateTime? @map("paid_start") @db.Timestamptz(6)
|
|
73
|
+
paidEnd DateTime? @map("paid_end") @db.Timestamptz(6)
|
|
74
|
+
|
|
75
|
+
// ===== OneTimePaid =====
|
|
76
|
+
balanceOneTimePaid Int @default(0) @map("balance_onetime_paid")
|
|
77
|
+
totalOneTimePaidLimit Int @default(0) @map("total_onetime_paid_limit")
|
|
78
|
+
oneTimePaidStart DateTime? @map("onetime_paid_start") @db.Timestamptz(6)
|
|
79
|
+
oneTimePaidEnd DateTime? @map("onetime_paid_end") @db.Timestamptz(6)
|
|
80
|
+
|
|
81
|
+
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
|
82
|
+
updatedAt DateTime? @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
|
|
83
|
+
user User @relation(fields: [userId], references: [userId], onDelete: NoAction, onUpdate: NoAction)
|
|
84
|
+
|
|
85
|
+
@@index([userId], map: "idx_credits_user_id")
|
|
86
|
+
@@map("credits")
|
|
87
|
+
|
|
88
|
+
@@schema("diaomao")
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
model Transaction {
|
|
92
|
+
id BigInt @id @default(autoincrement())
|
|
93
|
+
userId String @map("user_id") @db.Uuid
|
|
94
|
+
orderId String @unique @map("order_id") @db.VarChar(255)
|
|
95
|
+
orderStatus String @default("created") @map("order_status") @db.VarChar(50)
|
|
96
|
+
orderCreatedAt DateTime? @default(now()) @map("order_created_at") @db.Timestamptz(6)
|
|
97
|
+
orderExpiredAt DateTime? @map("order_expired_at") @db.Timestamptz(6)
|
|
98
|
+
orderUpdatedAt DateTime? @default(now()) @updatedAt @map("order_updated_at") @db.Timestamptz(6)
|
|
99
|
+
type String? @db.VarChar(50)
|
|
100
|
+
paySupplier String? @map("pay_supplier") @db.VarChar(255)
|
|
101
|
+
paySessionId String? @map("pay_session_id") @db.VarChar(255)
|
|
102
|
+
payTransactionId String? @unique @map("pay_transaction_id") @db.VarChar(255)
|
|
103
|
+
paySubscriptionId String? @map("pay_subscription_id") @db.VarChar(255)
|
|
104
|
+
subPeriodStart DateTime? @map("sub_period_start") @db.Timestamptz(6)
|
|
105
|
+
subPeriodEnd DateTime? @map("sub_period_end") @db.Timestamptz(6)
|
|
106
|
+
subLastTryCancelAt DateTime? @map("sub_last_try_cancel_at") @db.Timestamptz(6)
|
|
107
|
+
subPeriodCanceledAt DateTime? @map("sub_period_canceled_at") @db.Timestamptz(6)
|
|
108
|
+
subCancellationDetail String? @map("sub_cancellation_detail") @db.Text
|
|
109
|
+
priceId String? @map("price_id") @db.VarChar(255)
|
|
110
|
+
priceName String? @map("price_name") @db.VarChar(255)
|
|
111
|
+
amount Decimal? @db.Decimal(10, 2)
|
|
112
|
+
currency String? @db.VarChar(50)
|
|
113
|
+
creditsGranted Int? @default(0) @map("credits_granted")
|
|
114
|
+
payInvoiceId String? @map("pay_invoice_id") @db.VarChar(255)
|
|
115
|
+
paymentStatus String @default("un_paid") @map("payment_status") @db.VarChar(50)
|
|
116
|
+
billingReason String? @map("billing_reason") @db.VarChar(100)
|
|
117
|
+
hostedInvoiceUrl String? @map("hosted_invoice_url") @db.Text
|
|
118
|
+
invoicePdf String? @map("invoice_pdf") @db.Text
|
|
119
|
+
orderDetail String? @map("order_detail")
|
|
120
|
+
paidEmail String? @map("paid_email") @db.VarChar(255)
|
|
121
|
+
paidAt DateTime? @map("paid_at") @db.Timestamptz(6)
|
|
122
|
+
paidDetail String? @map("paid_detail")
|
|
123
|
+
payUpdatedAt DateTime? @map("pay_updated_at") @db.Timestamptz(6)
|
|
124
|
+
deleted Int @default(0)
|
|
125
|
+
user User @relation(fields: [userId], references: [userId], onDelete: NoAction, onUpdate: NoAction)
|
|
126
|
+
|
|
127
|
+
@@index([orderId], map: "idx_transactions_order_id")
|
|
128
|
+
@@index([paySubscriptionId], map: "idx_transactions_pay_subscription_id")
|
|
129
|
+
@@index([userId], map: "idx_transactions_user_id")
|
|
130
|
+
@@map("transactions")
|
|
131
|
+
|
|
132
|
+
@@schema("diaomao")
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
model CreditAuditLog {
|
|
136
|
+
id BigInt @id @default(autoincrement())
|
|
137
|
+
userId String @map("user_id") @db.Uuid
|
|
138
|
+
creditsChange Int @map("credits_change")
|
|
139
|
+
feature String? @db.VarChar(255)
|
|
140
|
+
creditType String @map("credit_type") @db.VarChar(50)
|
|
141
|
+
operationType String @map("operation_type") @db.VarChar(100)
|
|
142
|
+
operationReferId String? @map("operation_refer_id") @db.VarChar(255)
|
|
143
|
+
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
|
144
|
+
deleted Int @default(0)
|
|
145
|
+
user User @relation(fields: [userId], references: [userId], onDelete: NoAction, onUpdate: NoAction)
|
|
146
|
+
|
|
147
|
+
@@index([creditType], map: "idx_credit_audit_log_credit_type")
|
|
148
|
+
@@index([operationType], map: "idx_credit_audit_log_operation_type")
|
|
149
|
+
@@index([userId], map: "idx_credit_audit_log_user_id")
|
|
150
|
+
@@map("credit_audit_log")
|
|
151
|
+
|
|
152
|
+
@@schema("diaomao")
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
model UserBackup {
|
|
156
|
+
id BigInt @id @default(autoincrement())
|
|
157
|
+
originalUserId String @map("original_user_id") @db.Uuid
|
|
158
|
+
status String? @db.VarChar(50)
|
|
159
|
+
fingerprintId String? @map("fingerprint_id") @db.VarChar(255)
|
|
160
|
+
clerkUserId String? @map("clerk_user_id") @db.VarChar(255)
|
|
161
|
+
stripeCusId String? @map("stripe_cus_id") @db.VarChar(255)
|
|
162
|
+
email String? @db.VarChar(255)
|
|
163
|
+
userName String? @map("user_name") @db.VarChar(255)
|
|
164
|
+
backupData Json? @map("backup_data")
|
|
165
|
+
deletedAt DateTime? @default(now()) @map("deleted_at") @db.Timestamptz(6)
|
|
166
|
+
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
|
167
|
+
deleted Int @default(0)
|
|
168
|
+
|
|
169
|
+
@@index([clerkUserId], map: "idx_user_backup_clerk_user_id")
|
|
170
|
+
@@index([email], map: "idx_user_backup_email")
|
|
171
|
+
@@index([fingerprintId], map: "idx_user_backup_fingerprint_id")
|
|
172
|
+
@@index([originalUserId], map: "idx_user_backup_original_user_id")
|
|
173
|
+
@@map("user_backup")
|
|
174
|
+
|
|
175
|
+
@@schema("diaomao")
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
model Apilog {
|
|
179
|
+
id BigInt @id @default(autoincrement())
|
|
180
|
+
apiType String @map("api_type") @db.VarChar(100)
|
|
181
|
+
methodName String @map("method_name") @db.VarChar(255)
|
|
182
|
+
summary String?
|
|
183
|
+
request String?
|
|
184
|
+
response String?
|
|
185
|
+
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
|
186
|
+
|
|
187
|
+
@@map("apilog")
|
|
188
|
+
|
|
189
|
+
@@schema("diaomao")
|
|
190
|
+
}
|
package/prisma.config.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { defineConfig, env } from 'prisma/config';
|
|
2
|
+
import { config as loadEnv } from 'dotenv';
|
|
3
|
+
|
|
4
|
+
loadEnv({ path: '.env.local', quiet: true });
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
schema: 'prisma/schema.prisma',
|
|
8
|
+
datasource: {
|
|
9
|
+
url: env('DATABASE_URL'),
|
|
10
|
+
},
|
|
11
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
// biome-ignore-all lint: generated file
|
|
5
|
+
// @ts-nocheck
|
|
6
|
+
/*
|
|
7
|
+
* This file should be your main import to use Prisma-related types and utilities in a browser.
|
|
8
|
+
* Use it to get access to models, enums, and input types.
|
|
9
|
+
*
|
|
10
|
+
* This file does not contain a `PrismaClient` class, nor several other helpers that are intended as server-side only.
|
|
11
|
+
* See `client.ts` for the standard, server-side entry point.
|
|
12
|
+
*
|
|
13
|
+
* 🟢 You can import this file directly.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import * as Prisma from './internal/prismaNamespaceBrowser'
|
|
17
|
+
export { Prisma }
|
|
18
|
+
export * as $Enums from './enums'
|
|
19
|
+
export * from './enums';
|
|
20
|
+
/**
|
|
21
|
+
* Model User
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
export type User = Prisma.UserModel
|
|
25
|
+
/**
|
|
26
|
+
* Model Subscription
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
export type Subscription = Prisma.SubscriptionModel
|
|
30
|
+
/**
|
|
31
|
+
* Model Credit
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
export type Credit = Prisma.CreditModel
|
|
35
|
+
/**
|
|
36
|
+
* Model Transaction
|
|
37
|
+
*
|
|
38
|
+
*/
|
|
39
|
+
export type Transaction = Prisma.TransactionModel
|
|
40
|
+
/**
|
|
41
|
+
* Model CreditAuditLog
|
|
42
|
+
*
|
|
43
|
+
*/
|
|
44
|
+
export type CreditAuditLog = Prisma.CreditAuditLogModel
|
|
45
|
+
/**
|
|
46
|
+
* Model UserBackup
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
export type UserBackup = Prisma.UserBackupModel
|
|
50
|
+
/**
|
|
51
|
+
* Model Apilog
|
|
52
|
+
*
|
|
53
|
+
*/
|
|
54
|
+
export type Apilog = Prisma.ApilogModel
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
|
|
2
|
+
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
// biome-ignore-all lint: generated file
|
|
5
|
+
// @ts-nocheck
|
|
6
|
+
/*
|
|
7
|
+
* This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.
|
|
8
|
+
* If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.
|
|
9
|
+
*
|
|
10
|
+
* 🟢 You can import this file directly.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import * as process from 'node:process'
|
|
14
|
+
import * as path from 'node:path'
|
|
15
|
+
import { fileURLToPath } from 'node:url'
|
|
16
|
+
globalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))
|
|
17
|
+
|
|
18
|
+
import * as runtime from "@prisma/client/runtime/client"
|
|
19
|
+
import * as $Enums from "./enums"
|
|
20
|
+
import * as $Class from "./internal/class"
|
|
21
|
+
import * as Prisma from "./internal/prismaNamespace"
|
|
22
|
+
|
|
23
|
+
export * as $Enums from './enums'
|
|
24
|
+
export * from "./enums"
|
|
25
|
+
/**
|
|
26
|
+
* ## Prisma Client
|
|
27
|
+
*
|
|
28
|
+
* Type-safe database client for TypeScript
|
|
29
|
+
* @example
|
|
30
|
+
* ```
|
|
31
|
+
* const prisma = new PrismaClient({
|
|
32
|
+
* adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })
|
|
33
|
+
* })
|
|
34
|
+
* // Fetch zero or more Users
|
|
35
|
+
* const users = await prisma.user.findMany()
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* Read more in our [docs](https://pris.ly/d/client).
|
|
39
|
+
*/
|
|
40
|
+
export const PrismaClient = $Class.getPrismaClientClass()
|
|
41
|
+
export type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions["omit"] = Prisma.PrismaClientOptions["omit"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>
|
|
42
|
+
export { Prisma }
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Model User
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
export type User = Prisma.UserModel
|
|
49
|
+
/**
|
|
50
|
+
* Model Subscription
|
|
51
|
+
*
|
|
52
|
+
*/
|
|
53
|
+
export type Subscription = Prisma.SubscriptionModel
|
|
54
|
+
/**
|
|
55
|
+
* Model Credit
|
|
56
|
+
*
|
|
57
|
+
*/
|
|
58
|
+
export type Credit = Prisma.CreditModel
|
|
59
|
+
/**
|
|
60
|
+
* Model Transaction
|
|
61
|
+
*
|
|
62
|
+
*/
|
|
63
|
+
export type Transaction = Prisma.TransactionModel
|
|
64
|
+
/**
|
|
65
|
+
* Model CreditAuditLog
|
|
66
|
+
*
|
|
67
|
+
*/
|
|
68
|
+
export type CreditAuditLog = Prisma.CreditAuditLogModel
|
|
69
|
+
/**
|
|
70
|
+
* Model UserBackup
|
|
71
|
+
*
|
|
72
|
+
*/
|
|
73
|
+
export type UserBackup = Prisma.UserBackupModel
|
|
74
|
+
/**
|
|
75
|
+
* Model Apilog
|
|
76
|
+
*
|
|
77
|
+
*/
|
|
78
|
+
export type Apilog = Prisma.ApilogModel
|