@wecode-team/cms-supabase-api 0.1.33 → 0.1.35

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/README.md CHANGED
@@ -94,7 +94,9 @@ import { cors } from 'hono/cors'
94
94
  import {
95
95
  initializeSupabase,
96
96
  initializeCmsSystem,
97
- createCmsRoutes
97
+ initializeOssUpload,
98
+ createCmsRoutes,
99
+ createOssUploadRoute,
98
100
  } from '@wecode-team/cms-supabase-api'
99
101
 
100
102
  const app = new Hono()
@@ -111,9 +113,23 @@ initializeSupabase({
111
113
  // 初始化 CMS 系统表
112
114
  await initializeCmsSystem()
113
115
 
116
+ // 初始化 OSS 上传
117
+ initializeOssUpload({
118
+ bucket: process.env.OSS_BUCKET!,
119
+ endpoint: process.env.OSS_ENDPOINT!,
120
+ accessKeyId: process.env.OSS_ACCESS_KEY_ID!,
121
+ accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET!,
122
+ publicBaseUrl: process.env.OSS_PUBLIC_BASE_URL,
123
+ prefix: 'cms-assets',
124
+ returnMode: 'both',
125
+ })
126
+
114
127
  // 一键创建所有 CMS 路由
115
128
  createCmsRoutes(app)
116
129
 
130
+ // 创建上传路由
131
+ createOssUploadRoute(app)
132
+
117
133
  export default app
118
134
  ```
119
135
 
@@ -191,6 +207,12 @@ export default app
191
207
  |------|------|------|
192
208
  | GET | `/relation/:tableName/options` | 获取关联表选项(用于下拉选择) |
193
209
 
210
+ ### 资源上传
211
+
212
+ | 方法 | 路径 | 描述 |
213
+ |------|------|------|
214
+ | POST | `/upload` | 上传单个文件到阿里云 OSS,默认需要管理员登录 |
215
+
194
216
  ### 认证
195
217
 
196
218
  | 方法 | 路径 | 描述 |
@@ -205,6 +227,60 @@ export default app
205
227
 
206
228
  > 提示:后台管理接口(`/models`、`/data/*` 等)建议携带请求头 `X-Session-Id`,用于按 `session_id` 维度校验管理员权限。
207
229
 
230
+ ## ☁️ OSS 上传
231
+
232
+ 宿主项目只需要两步:
233
+
234
+ 1. 调用 `initializeOssUpload(config)`
235
+ 2. 调用 `createOssUploadRoute(app)`
236
+
237
+ 最小示例:
238
+
239
+ ```typescript
240
+ initializeOssUpload({
241
+ bucket: process.env.OSS_BUCKET!,
242
+ endpoint: process.env.OSS_ENDPOINT!,
243
+ accessKeyId: process.env.OSS_ACCESS_KEY_ID!,
244
+ accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET!,
245
+ publicBaseUrl: process.env.OSS_PUBLIC_BASE_URL,
246
+ prefix: "cms-assets",
247
+ maxSize: 2 * 1024 * 1024,
248
+ returnMode: "both",
249
+ signedUrlExpiresIn: 60 * 60,
250
+ })
251
+
252
+ createOssUploadRoute(app)
253
+ ```
254
+
255
+ 上传请求要求:
256
+
257
+ - `POST /upload`
258
+ - `multipart/form-data`
259
+ - 文件字段名固定为 `file`
260
+ - 可选文本字段:`directory`、`fieldName`、`tableName`
261
+ - 默认要求 `Authorization` 和 `X-Session-Id`,并通过现有 admin 鉴权
262
+
263
+ 上传成功返回:
264
+
265
+ ```json
266
+ {
267
+ "success": true,
268
+ "url": "https://bucket.endpoint/path/to/object.png",
269
+ "signedUrl": "https://bucket.endpoint/path/to/object.png?...",
270
+ "objectKey": "cms-assets/logos/20260316120000-abcdef.png",
271
+ "fieldName": "logo",
272
+ "tableName": "site_config"
273
+ }
274
+ ```
275
+
276
+ `returnMode` 说明:
277
+
278
+ - `public-url`: 返回公开 URL
279
+ - `signed-url`: 返回签名 URL,并将 `url` 也设置为该签名地址
280
+ - `both`: 同时返回 `url` 和 `signedUrl`
281
+
282
+ 如果 bucket 是私有读,推荐使用 `signed-url` 或 `both`。
283
+
208
284
  ## 🏗️ 字段类型
209
285
 
210
286
  | 类型 | PostgreSQL 类型 | 说明 |
package/USAGE_EXAMPLE.md CHANGED
@@ -9,7 +9,9 @@
9
9
  import { Hono } from 'hono'
10
10
  import {
11
11
  initializeSupabase,
12
+ initializeOssUpload,
12
13
  createCmsRoutes,
14
+ createOssUploadRoute,
13
15
  testConnection
14
16
  } from '@wecode-team/cms-supabase-api'
15
17
 
@@ -24,8 +26,18 @@ initializeSupabase({
24
26
  // 测试连接
25
27
  await testConnection()
26
28
 
29
+ initializeOssUpload({
30
+ bucket: 'your-bucket',
31
+ endpoint: 'oss-cn-beijing.aliyuncs.com',
32
+ accessKeyId: 'your-access-key-id',
33
+ accessKeySecret: 'your-access-key-secret',
34
+ publicBaseUrl: 'https://your-bucket.oss-cn-beijing.aliyuncs.com',
35
+ returnMode: 'both',
36
+ })
37
+
27
38
  // 创建所有 CMS 路由
28
39
  createCmsRoutes(app)
40
+ createOssUploadRoute(app)
29
41
 
30
42
  // 添加自定义路由
31
43
  app.get('/', (c) => {
@@ -45,7 +57,9 @@ import { serve } from '@hono/node-server'
45
57
  import { Hono } from 'hono'
46
58
  import {
47
59
  initializeSupabase,
48
- createCmsRoutes
60
+ initializeOssUpload,
61
+ createCmsRoutes,
62
+ createOssUploadRoute,
49
63
  } from '@wecode-team/cms-supabase-api'
50
64
 
51
65
  const app = new Hono()
@@ -56,8 +70,18 @@ initializeSupabase({
56
70
  key: process.env.SUPABASE_ANON_KEY!
57
71
  })
58
72
 
73
+ initializeOssUpload({
74
+ bucket: process.env.OSS_BUCKET!,
75
+ endpoint: process.env.OSS_ENDPOINT!,
76
+ accessKeyId: process.env.OSS_ACCESS_KEY_ID!,
77
+ accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET!,
78
+ publicBaseUrl: process.env.OSS_PUBLIC_BASE_URL,
79
+ returnMode: 'both',
80
+ })
81
+
59
82
  // 添加路由
60
83
  createCmsRoutes(app)
84
+ createOssUploadRoute(app)
61
85
 
62
86
  // 启动服务器
63
87
  const port = 3000
@@ -76,7 +100,9 @@ serve({
76
100
  import { Hono } from 'hono'
77
101
  import {
78
102
  initializeSupabase,
79
- createCmsRoutes
103
+ initializeOssUpload,
104
+ createCmsRoutes,
105
+ createOssUploadRoute,
80
106
  } from '@wecode-team/cms-supabase-api'
81
107
 
82
108
  const app = new Hono()
@@ -86,7 +112,17 @@ initializeSupabase({
86
112
  key: Bun.env.SUPABASE_ANON_KEY!
87
113
  })
88
114
 
115
+ initializeOssUpload({
116
+ bucket: Bun.env.OSS_BUCKET!,
117
+ endpoint: Bun.env.OSS_ENDPOINT!,
118
+ accessKeyId: Bun.env.OSS_ACCESS_KEY_ID!,
119
+ accessKeySecret: Bun.env.OSS_ACCESS_KEY_SECRET!,
120
+ publicBaseUrl: Bun.env.OSS_PUBLIC_BASE_URL,
121
+ returnMode: 'both',
122
+ })
123
+
89
124
  createCmsRoutes(app)
125
+ createOssUploadRoute(app)
90
126
 
91
127
  export default {
92
128
  port: 3000,
@@ -139,6 +175,38 @@ app.get('/health', (c) => {
139
175
  export default app
140
176
  ```
141
177
 
178
+ ### 资源上传路由
179
+
180
+ ```typescript
181
+ import { Hono } from 'hono'
182
+ import {
183
+ initializeSupabase,
184
+ initializeOssUpload,
185
+ createOssUploadRoute,
186
+ } from '@wecode-team/cms-supabase-api'
187
+
188
+ const app = new Hono()
189
+
190
+ initializeSupabase({
191
+ url: process.env.SUPABASE_URL!,
192
+ key: process.env.SUPABASE_ANON_KEY!,
193
+ })
194
+
195
+ initializeOssUpload({
196
+ bucket: process.env.OSS_BUCKET!,
197
+ endpoint: process.env.OSS_ENDPOINT!,
198
+ accessKeyId: process.env.OSS_ACCESS_KEY_ID!,
199
+ accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET!,
200
+ publicBaseUrl: process.env.OSS_PUBLIC_BASE_URL,
201
+ prefix: 'cms-assets',
202
+ returnMode: 'both',
203
+ })
204
+
205
+ createOssUploadRoute(app)
206
+
207
+ export default app
208
+ ```
209
+
142
210
  ### 使用固定表名的认证
143
211
 
144
212
  ```typescript
@@ -264,4 +332,3 @@ curl http://localhost:3000/auth/cms_users/current \
264
332
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
265
333
  ```
266
334
 
267
-
@@ -0,0 +1,25 @@
1
+ import type { Context } from "hono";
2
+ export declare function uploadToOss(c: Context): Promise<(Response & import("hono").TypedResponse<{
3
+ success: boolean;
4
+ url?: string | undefined;
5
+ signedUrl?: string | undefined;
6
+ objectKey?: string | undefined;
7
+ fieldName?: string | undefined;
8
+ tableName?: string | undefined;
9
+ message?: string | undefined;
10
+ error?: string | undefined;
11
+ }, 200, "json">) | (Response & import("hono").TypedResponse<{
12
+ success: boolean;
13
+ message?: string | undefined;
14
+ data?: {
15
+ success: boolean;
16
+ url?: string | undefined;
17
+ signedUrl?: string | undefined;
18
+ objectKey?: string | undefined;
19
+ fieldName?: string | undefined;
20
+ tableName?: string | undefined;
21
+ message?: string | undefined;
22
+ error?: string | undefined;
23
+ } | undefined;
24
+ error?: string | undefined;
25
+ }, 400 | 500 | 403 | 502, "json">)>;
package/dist/index.d.ts CHANGED
@@ -3,9 +3,12 @@ export { default as CmsModelService, getCmsModelService, initializeCmsModel, } f
3
3
  export { getCmsModelService as CmsModel } from "./models/cms-model";
4
4
  export { DynamicTableService, getDynamicTableService, } from "./services/dynamic-table.service";
5
5
  export { AuthService, getAuthService, } from "./services/auth.service";
6
+ export { OssUploadService, OssUploadError, initializeOssUpload, getOssUploadService, } from "./services/oss-upload.service";
6
7
  export { getModels, createModel, updateModel, deleteModel, } from "./handlers/models";
7
8
  export { getTableData, createTableData, updateTableData, deleteTableData, getRelationOptions, getTableDataWithRelations, dropForeignKeys, } from "./handlers/data";
8
9
  export { login, signup, signupStatus, verifyAuth, getCurrentUser, requireAuth, } from "./handlers/auth";
10
+ export { uploadToOss, } from "./handlers/upload";
9
11
  export type { SchemaField, JsonSchema, CmsModelAttributes, CmsModelCreationAttributes, ApiResponse, PaginatedResponse, SupabaseConfig, DatabaseConfig, TableDataOptions, SupabaseFilter, FieldTypeMapping, RelationType, RelationConfig, RelationOption, GetRelationOptionsParams, } from "./types";
10
12
  export type { User, UserInfo, LoginRequest, LoginResponse, } from "./handlers/auth";
11
- export { createCmsRoutes, createModelRoute, createDynamicDataRoute, createDynamicAuthRoute, createDataRoute, createAuthRoute, } from "./utils/route-helpers";
13
+ export { createCmsRoutes, createModelRoute, createDynamicDataRoute, createDynamicAuthRoute, createDataRoute, createAuthRoute, createOssUploadRoute, } from "./utils/route-helpers";
14
+ export type { OssUploadProvider, OssUploadReturnMode, OssUploadConfig, NormalizedOssUploadConfig, OssUploadInput, OssUploadResult, UploadRouteResponse, } from "./types/upload";