@zlooks.cn/images-server 1.0.2 → 1.0.4
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/dist/assets/read-image-asset.d.ts.map +1 -1
- package/dist/assets/read-image-asset.js +7 -2
- package/dist/assets/read-image-asset.js.map +1 -1
- package/dist/assets/response-policy.d.ts.map +1 -1
- package/dist/assets/response-policy.js +10 -4
- package/dist/assets/response-policy.js.map +1 -1
- package/dist/domain/image-error.d.ts +5 -2
- package/dist/domain/image-error.d.ts.map +1 -1
- package/dist/domain/image-error.js.map +1 -1
- package/dist/domain/output-schema.d.ts +1 -62
- package/dist/domain/output-schema.d.ts.map +1 -1
- package/dist/domain/output-schema.js +1 -24
- package/dist/domain/output-schema.js.map +1 -1
- package/dist/domain/schema.d.ts +1 -68
- package/dist/domain/schema.d.ts.map +1 -1
- package/dist/domain/schema.js +1 -43
- package/dist/domain/schema.js.map +1 -1
- package/dist/identity.d.ts +1 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +1 -1
- package/dist/identity.js.map +1 -1
- package/dist/mcp/provider.d.ts +2 -1
- package/dist/mcp/provider.d.ts.map +1 -1
- package/dist/mcp/provider.js +100 -44
- package/dist/mcp/provider.js.map +1 -1
- package/dist/messages/images/delete.msg.d.ts +3 -0
- package/dist/messages/images/delete.msg.d.ts.map +1 -0
- package/dist/messages/images/delete.msg.js +9 -0
- package/dist/messages/images/delete.msg.js.map +1 -0
- package/dist/messages/images/events.msg.d.ts +3 -0
- package/dist/messages/images/events.msg.d.ts.map +1 -0
- package/dist/messages/images/events.msg.js +9 -0
- package/dist/messages/images/events.msg.js.map +1 -0
- package/dist/messages/images/list.msg.d.ts +3 -0
- package/dist/messages/images/list.msg.d.ts.map +1 -0
- package/dist/messages/images/list.msg.js +9 -0
- package/dist/messages/images/list.msg.js.map +1 -0
- package/dist/messages/images/read.msg.d.ts +3 -0
- package/dist/messages/images/read.msg.d.ts.map +1 -0
- package/dist/messages/images/read.msg.js +9 -0
- package/dist/messages/images/read.msg.js.map +1 -0
- package/dist/messages/images/upload.msg.d.ts +3 -0
- package/dist/messages/images/upload.msg.d.ts.map +1 -0
- package/dist/messages/images/upload.msg.js +9 -0
- package/dist/messages/images/upload.msg.js.map +1 -0
- package/dist/messages/model-message.d.ts +8 -0
- package/dist/messages/model-message.d.ts.map +1 -0
- package/dist/messages/model-message.js +18 -0
- package/dist/messages/model-message.js.map +1 -0
- package/dist/migrations/index.d.ts +2 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +50 -2
- package/dist/migrations/index.js.map +1 -1
- package/dist/models/delete-image.model.js +14 -7
- package/dist/models/delete-image.model.js.map +1 -1
- package/dist/models/list-image.model.js +6 -3
- package/dist/models/list-image.model.js.map +1 -1
- package/dist/models/read-image-event-catalog.model.d.ts +3 -0
- package/dist/models/read-image-event-catalog.model.d.ts.map +1 -0
- package/dist/models/read-image-event-catalog.model.js +7 -0
- package/dist/models/read-image-event-catalog.model.js.map +1 -0
- package/dist/models/read-image.model.js +2 -2
- package/dist/models/read-image.model.js.map +1 -1
- package/dist/models/upload-image.model.d.ts +6 -2
- package/dist/models/upload-image.model.d.ts.map +1 -1
- package/dist/models/upload-image.model.js +8 -7
- package/dist/models/upload-image.model.js.map +1 -1
- package/dist/persistence/entities.d.ts.map +1 -1
- package/dist/persistence/entities.js +85 -12
- package/dist/persistence/entities.js.map +1 -1
- package/dist/services/config.service.js.map +1 -1
- package/dist/services/database.service.js +9 -1
- package/dist/services/database.service.js.map +1 -1
- package/dist/services/images-runtime.service.js +4 -1
- package/dist/services/images-runtime.service.js.map +1 -1
- package/dist/services/mcp-provider.service.js +2 -1
- package/dist/services/mcp-provider.service.js.map +1 -1
- package/dist/services/redis.service.js +12 -4
- package/dist/services/redis.service.js.map +1 -1
- package/dist/storage/local-storage.d.ts.map +1 -1
- package/dist/storage/local-storage.js +13 -5
- package/dist/storage/local-storage.js.map +1 -1
- package/package.json +21 -21
package/dist/mcp/provider.js
CHANGED
|
@@ -1,65 +1,96 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { defineMcpProvider, defineMcpResource, defineMcpTool } from '@hile/mcp';
|
|
3
|
-
import { loadModel } from '@hile/model';
|
|
1
|
+
import { defineMcpProvider, defineMcpResource, defineMcpTool, } from '@hile/mcp';
|
|
4
2
|
import { z } from 'zod';
|
|
5
|
-
import { IMAGES_EVENT_CATALOG } from '@zlooks.cn/images-shared';
|
|
3
|
+
import { IMAGES_EVENT_CATALOG, ImagesOperationError, } from '@zlooks.cn/images-shared';
|
|
6
4
|
import { IMAGES_ID } from '../identity.js';
|
|
7
5
|
import { ImageError } from '../domain/image-error.js';
|
|
8
|
-
import { deleteImageSchema, listImageSchema, readImageSchema, uploadImageSchema } from '../domain/schema.js';
|
|
6
|
+
import { deleteImageSchema, listImageSchema, readImageSchema, uploadImageSchema, } from '../domain/schema.js';
|
|
9
7
|
import { imageMetadataSchema, imagePageSchema } from '../domain/output-schema.js';
|
|
10
|
-
import uploadImageModel from '../models/upload-image.model.js';
|
|
11
|
-
import readImageModel from '../models/read-image.model.js';
|
|
12
|
-
import listImageModel from '../models/list-image.model.js';
|
|
13
|
-
import deleteImageModel from '../models/delete-image.model.js';
|
|
14
8
|
const readAccess = { scopes: ['images:read'] };
|
|
15
9
|
const writeAccess = { scopes: ['images:write'] };
|
|
16
|
-
const readonlyHints = {
|
|
17
|
-
|
|
10
|
+
const readonlyHints = {
|
|
11
|
+
readOnlyHint: true,
|
|
12
|
+
idempotentHint: true,
|
|
13
|
+
destructiveHint: false,
|
|
14
|
+
};
|
|
15
|
+
export function createImagesProvider(images) {
|
|
18
16
|
return defineMcpProvider({
|
|
19
17
|
id: IMAGES_ID,
|
|
20
18
|
displayName: '图片存储',
|
|
21
19
|
tools: {
|
|
22
20
|
'upload-image': defineMcpTool({
|
|
23
|
-
name: 'upload-image',
|
|
21
|
+
name: 'upload-image',
|
|
22
|
+
title: '上传图片',
|
|
23
|
+
inputSchema: uploadImageSchema,
|
|
24
|
+
outputSchema: imageMetadataSchema,
|
|
24
25
|
description: '通过 Base64(解码后至多 6 MiB)上传调用方持有的 JPEG、PNG、WebP、GIF 或 AVIF 原图;不接受 URL 导入或本地路径,不下载远程图片。对完整文件字节进行标准 Base64 编码,提交前按 base64 参数说明检查字符、填充、长度和大小,不要提交截断内容。总像素最多 40 MP(动画按全部帧计),不接受 SVG、不转换原始内容。只有持久化并提交 ready 后成功返回元数据与公开 URL。响应丢失时,同一调用方用原幂等键和完全相同输入重试,不会重复创建;IDEMPOTENCY_CONFLICT 表示同键输入不同。UPLOAD_NOT_READY 时先通过 images.read-image 或 images.list-image 确认状态:uploading 不另建重复上传,确认 failed 后新上传使用新幂等键,deleted 不会复活。文件名仅用于搜索,不能指定存储路径。',
|
|
25
26
|
access: writeAccess,
|
|
26
|
-
annotations: {
|
|
27
|
+
annotations: {
|
|
28
|
+
readOnlyHint: false,
|
|
29
|
+
idempotentHint: true,
|
|
30
|
+
destructiveHint: false,
|
|
31
|
+
},
|
|
27
32
|
execution: { timeoutMs: 60_000, retry: 'never' },
|
|
28
|
-
}, (input, context) => toolResult(context, 'images:write', async (
|
|
29
|
-
const
|
|
30
|
-
|
|
33
|
+
}, (input, context) => toolResult(context, 'images:write', async () => {
|
|
34
|
+
const identity = context.principal?.clientId ?? context.principal?.subject;
|
|
35
|
+
const actor = z.string().min(1).max(128).parse(identity);
|
|
36
|
+
return images.upload({ actor, upload: uploadImageSchema.parse(input) }, microOptions(context));
|
|
31
37
|
})),
|
|
32
38
|
'list-image': defineMcpTool({
|
|
33
|
-
name: 'list-image',
|
|
39
|
+
name: 'list-image',
|
|
40
|
+
title: '查询图片',
|
|
41
|
+
inputSchema: listImageSchema,
|
|
42
|
+
outputSchema: imagePageSchema,
|
|
34
43
|
description: '按创建时间、格式、文件名、字节数、宽高、状态、上传者及 SHA-256 组合查询;不同条件 AND,集合内部 OR。时间范围左闭右开,默认创建时间倒序;每页默认 20、最多 100 条。将返回的 nextCursor 作为 cursor 查询下一页,保持筛选条件及排序;hasMore=false 时停止。默认不返回 deleted,不提供 total;空结果不是错误。分页不是跨请求快照,INVALID_CURSOR 时检查条件,变更条件需从第一页重新查询。',
|
|
35
|
-
access: readAccess,
|
|
44
|
+
access: readAccess,
|
|
45
|
+
annotations: readonlyHints,
|
|
36
46
|
execution: { timeoutMs: 10_000, retry: 'idempotent-failover' },
|
|
37
|
-
}, (input, context) => toolResult(context, 'images:read', (
|
|
47
|
+
}, (input, context) => toolResult(context, 'images:read', () => (images.list(listImageSchema.parse(input), microOptions(context))))),
|
|
38
48
|
'read-image': defineMcpTool({
|
|
39
|
-
name: 'read-image',
|
|
49
|
+
name: 'read-image',
|
|
50
|
+
title: '读取图片元数据',
|
|
51
|
+
inputSchema: readImageSchema,
|
|
52
|
+
outputSchema: imageMetadataSchema,
|
|
40
53
|
description: '按图片 ID 读取元数据、当前状态和公开原图地址。不会返回图片二进制或本地路径;只有 ready 状态有公开 URL。可用于检查上传结果,或在删除前确认 SHA-256 与目标图片。',
|
|
41
|
-
access: readAccess,
|
|
54
|
+
access: readAccess,
|
|
55
|
+
annotations: readonlyHints,
|
|
42
56
|
execution: { timeoutMs: 10_000, retry: 'idempotent-failover' },
|
|
43
|
-
}, (input, context) => toolResult(context, 'images:read', (
|
|
57
|
+
}, (input, context) => toolResult(context, 'images:read', () => (images.read(readImageSchema.parse(input), microOptions(context))))),
|
|
44
58
|
'delete-image': defineMcpTool({
|
|
45
|
-
name: 'delete-image',
|
|
59
|
+
name: 'delete-image',
|
|
60
|
+
title: '删除图片',
|
|
61
|
+
inputSchema: deleteImageSchema,
|
|
62
|
+
outputSchema: imageMetadataSchema,
|
|
46
63
|
description: '永久删除本地原图并禁用新的源站读取。先用 images.read-image 读取目标并向用户确认,再提交 id 和 expectedSha256,无需删除幂等键。只允许 ready、deleting 或已 deleted 的记录;HASH_CONFLICT 或 STATE_CONFLICT 时重新读取,不能猜测摘要重试。清理失败或响应丢失后用原 ID 与摘要重试;并发和重复删除安全,成功返回 deleted 元数据且保留首次 deletedAt。此操作不能撤销,也无法清除浏览器或第三方已缓存的副本。',
|
|
47
64
|
access: writeAccess,
|
|
48
|
-
annotations: {
|
|
65
|
+
annotations: {
|
|
66
|
+
readOnlyHint: false,
|
|
67
|
+
idempotentHint: true,
|
|
68
|
+
destructiveHint: true,
|
|
69
|
+
},
|
|
49
70
|
execution: { timeoutMs: 15_000, retry: 'never' },
|
|
50
|
-
}, (input, context) => toolResult(context, 'images:write', (
|
|
71
|
+
}, (input, context) => toolResult(context, 'images:write', () => (images.delete(deleteImageSchema.parse(input), microOptions(context))))),
|
|
51
72
|
},
|
|
52
73
|
resources: {
|
|
53
74
|
image: defineMcpResource({
|
|
54
|
-
kind: 'template',
|
|
55
|
-
|
|
75
|
+
kind: 'template',
|
|
76
|
+
name: 'image',
|
|
77
|
+
uriTemplate: 'images://image/{id}',
|
|
78
|
+
title: '图片元数据',
|
|
79
|
+
mimeType: 'application/json',
|
|
80
|
+
access: readAccess,
|
|
56
81
|
description: '由应用按图片 UUID 读取的 JSON 元数据,与 images.read-image 返回字段一致。包含状态、原始文件名、媒体属性、SHA-256、创建者和时间;只有 ready 返回公开 URL。不返回图片二进制、Base64、本地路径或上传幂等键,也不触发上传、删除或恢复。图片展示使用返回的公开 URL;需要 images:read 权限。',
|
|
57
82
|
}, async (variables, context) => {
|
|
58
83
|
assertAccess(context, 'images:read');
|
|
59
84
|
try {
|
|
60
|
-
const
|
|
61
|
-
const result = await
|
|
62
|
-
return {
|
|
85
|
+
const query = readImageSchema.parse({ id: variables.id });
|
|
86
|
+
const result = await images.read(query, microOptions(context));
|
|
87
|
+
return {
|
|
88
|
+
contents: [{
|
|
89
|
+
uri: `images://image/${query.id}`,
|
|
90
|
+
mimeType: 'application/json',
|
|
91
|
+
text: JSON.stringify(result),
|
|
92
|
+
}],
|
|
93
|
+
};
|
|
63
94
|
}
|
|
64
95
|
catch (error) {
|
|
65
96
|
context.signal.throwIfAborted();
|
|
@@ -67,18 +98,29 @@ export function createImagesProvider() {
|
|
|
67
98
|
}
|
|
68
99
|
}),
|
|
69
100
|
'event-catalog': defineMcpResource({
|
|
70
|
-
kind: 'static',
|
|
71
|
-
|
|
101
|
+
kind: 'static',
|
|
102
|
+
name: 'event-catalog',
|
|
103
|
+
uri: 'hile://images/events',
|
|
104
|
+
title: '图片领域事件目录',
|
|
105
|
+
mimeType: 'application/json',
|
|
106
|
+
access: readAccess,
|
|
72
107
|
description: `当前图片服务实例提供 ${IMAGES_EVENT_CATALOG.count} 个领域事件契约;创建或修改消费服务前读取此目录。`,
|
|
73
108
|
}, async (uri, context) => {
|
|
74
109
|
assertAccess(context, 'images:read');
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
110
|
+
try {
|
|
111
|
+
const catalog = await images.readEventCatalog(microOptions(context));
|
|
112
|
+
return {
|
|
113
|
+
contents: [{
|
|
114
|
+
uri: uri.toString(),
|
|
115
|
+
mimeType: 'application/json',
|
|
116
|
+
text: JSON.stringify(catalog),
|
|
117
|
+
}],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
context.signal.throwIfAborted();
|
|
122
|
+
throw safeError(error);
|
|
123
|
+
}
|
|
82
124
|
}),
|
|
83
125
|
},
|
|
84
126
|
});
|
|
@@ -86,26 +128,40 @@ export function createImagesProvider() {
|
|
|
86
128
|
function assertAccess(context, scope) {
|
|
87
129
|
context.signal.throwIfAborted();
|
|
88
130
|
const scopes = context.principal?.scopes ?? [];
|
|
89
|
-
if (!scopes.includes('*') && !scopes.includes(scope))
|
|
131
|
+
if (!scopes.includes('*') && !scopes.includes(scope)) {
|
|
90
132
|
throw new ImageError('FORBIDDEN', '没有图片操作权限');
|
|
133
|
+
}
|
|
91
134
|
}
|
|
92
135
|
async function toolResult(context, scope, run) {
|
|
93
136
|
assertAccess(context, scope);
|
|
94
137
|
try {
|
|
95
|
-
const result = await run(
|
|
96
|
-
return {
|
|
138
|
+
const result = await run();
|
|
139
|
+
return {
|
|
140
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
141
|
+
structuredContent: result,
|
|
142
|
+
};
|
|
97
143
|
}
|
|
98
144
|
catch (error) {
|
|
99
145
|
context.signal.throwIfAborted();
|
|
100
146
|
const safe = safeError(error);
|
|
101
|
-
return {
|
|
147
|
+
return {
|
|
148
|
+
isError: true,
|
|
149
|
+
content: [{ type: 'text', text: `${safe.code}: ${safe.message}` }],
|
|
150
|
+
};
|
|
102
151
|
}
|
|
103
152
|
}
|
|
153
|
+
function microOptions(context) {
|
|
154
|
+
return { context: context.executionContext, signal: context.signal };
|
|
155
|
+
}
|
|
104
156
|
function safeError(error) {
|
|
105
157
|
if (error instanceof ImageError)
|
|
106
158
|
return error;
|
|
107
|
-
if (error instanceof
|
|
159
|
+
if (error instanceof ImagesOperationError) {
|
|
160
|
+
return new ImageError(error.code, error.message);
|
|
161
|
+
}
|
|
162
|
+
if (error instanceof z.ZodError) {
|
|
108
163
|
return new ImageError('INVALID_INPUT', '图片请求参数无效');
|
|
164
|
+
}
|
|
109
165
|
return new ImageError('UNAVAILABLE', '图片服务暂时不可用,请读取状态后重试');
|
|
110
166
|
}
|
|
111
167
|
//# sourceMappingURL=provider.js.map
|
package/dist/mcp/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/mcp/provider.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/mcp/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,GAEd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAIrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElF,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;AAC/C,MAAM,WAAW,GAAG,EAAE,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;AACjD,MAAM,aAAa,GAAG;IACpB,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAyB;IAC5D,OAAO,iBAAiB,CAAC;QACvB,EAAE,EAAE,SAAS;QACb,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE;YACL,cAAc,EAAE,aAAa,CAAC;gBAC5B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,iBAAiB;gBAC9B,YAAY,EAAE,mBAAmB;gBACjC,WAAW,EAAE,4ZAA4Z;gBACza,MAAM,EAAE,WAAW;gBACnB,WAAW,EAAE;oBACX,YAAY,EAAE,KAAK;oBACnB,cAAc,EAAE,IAAI;oBACpB,eAAe,EAAE,KAAK;iBACvB;gBACD,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;aACjD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE;gBACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;gBAC3E,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACzD,OAAO,MAAM,CAAC,MAAM,CAClB,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EACjD,YAAY,CAAC,OAAO,CAAC,CACtB,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,YAAY,EAAE,aAAa,CAAC;gBAC1B,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,eAAe;gBAC5B,YAAY,EAAE,eAAe;gBAC7B,WAAW,EAAE,wOAAwO;gBACrP,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,aAAa;gBAC1B,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE;aAC/D,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAC9D,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CACjE,CAAC,CAAC;YACH,YAAY,EAAE,aAAa,CAAC;gBAC1B,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,SAAS;gBAChB,WAAW,EAAE,eAAe;gBAC5B,YAAY,EAAE,mBAAmB;gBACjC,WAAW,EAAE,6FAA6F;gBAC1G,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,aAAa;gBAC1B,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE;aAC/D,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAC9D,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CACjE,CAAC,CAAC;YACH,cAAc,EAAE,aAAa,CAAC;gBAC5B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,iBAAiB;gBAC9B,YAAY,EAAE,mBAAmB;gBACjC,WAAW,EAAE,+PAA+P;gBAC5Q,MAAM,EAAE,WAAW;gBACnB,WAAW,EAAE;oBACX,YAAY,EAAE,KAAK;oBACnB,cAAc,EAAE,IAAI;oBACpB,eAAe,EAAE,IAAI;iBACtB;gBACD,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;aACjD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAC/D,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CACrE,CAAC,CAAC;SACJ;QACD,SAAS,EAAE;YACT,KAAK,EAAE,iBAAiB,CAAC;gBACvB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,qBAAqB;gBAClC,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,iLAAiL;aAC/L,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;gBAC9B,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC/D,OAAO;wBACL,QAAQ,EAAE,CAAC;gCACT,GAAG,EAAE,kBAAkB,KAAK,CAAC,EAAE,EAAE;gCACjC,QAAQ,EAAE,kBAAkB;gCAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;6BAC7B,CAAC;qBACH,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBAChC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC,CAAC;YACF,eAAe,EAAE,iBAAiB,CAAC;gBACjC,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,sBAAsB;gBAC3B,KAAK,EAAE,UAAU;gBACjB,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,cAAc,oBAAoB,CAAC,KAAK,2BAA2B;aACjF,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;gBACxB,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrE,OAAO;wBACL,QAAQ,EAAE,CAAC;gCACT,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;gCACnB,QAAQ,EAAE,kBAAkB;gCAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;6BAC9B,CAAC;qBACH,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBAChC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC,CAAC;SACH;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,OAA6B,EAAE,KAAa;IAChE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAA6B,EAC7B,KAAa,EACb,GAA6C;IAE7C,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,iBAAiB,EAAE,MAAM;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAA6B;IACjD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;QAC1C,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO,IAAI,UAAU,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.msg.d.ts","sourceRoot":"","sources":["../../../src/messages/images/delete.msg.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { defineMicroMessage } from '@hile/micro';
|
|
2
|
+
import { deleteImageSchema } from '@zlooks.cn/images-shared';
|
|
3
|
+
import deleteImageModel from '../../models/delete-image.model.js';
|
|
4
|
+
import { loadImageModel } from '../model-message.js';
|
|
5
|
+
export default defineMicroMessage(async ({ data, invocation }) => {
|
|
6
|
+
const command = deleteImageSchema.parse(data);
|
|
7
|
+
return loadImageModel(deleteImageModel, command, invocation);
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=delete.msg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.msg.js","sourceRoot":"","sources":["../../../src/messages/images/delete.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,gBAAgB,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,cAAc,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.msg.d.ts","sourceRoot":"","sources":["../../../src/messages/images/events.msg.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { defineMicroMessage } from '@hile/micro';
|
|
2
|
+
import { imageEmptyRequestSchema } from '@zlooks.cn/images-shared';
|
|
3
|
+
import readImageEventCatalogModel from '../../models/read-image-event-catalog.model.js';
|
|
4
|
+
import { loadImageModel } from '../model-message.js';
|
|
5
|
+
export default defineMicroMessage(async ({ data, invocation }) => {
|
|
6
|
+
const query = imageEmptyRequestSchema.parse(data);
|
|
7
|
+
return loadImageModel(readImageEventCatalogModel, query, invocation);
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=events.msg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.msg.js","sourceRoot":"","sources":["../../../src/messages/images/events.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,0BAA0B,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,cAAc,CAAC,0BAA0B,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.msg.d.ts","sourceRoot":"","sources":["../../../src/messages/images/list.msg.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { defineMicroMessage } from '@hile/micro';
|
|
2
|
+
import { listImageSchema } from '@zlooks.cn/images-shared';
|
|
3
|
+
import listImageModel from '../../models/list-image.model.js';
|
|
4
|
+
import { loadImageModel } from '../model-message.js';
|
|
5
|
+
export default defineMicroMessage(async ({ data, invocation }) => {
|
|
6
|
+
const query = listImageSchema.parse(data);
|
|
7
|
+
return loadImageModel(listImageModel, query, invocation);
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=list.msg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.msg.js","sourceRoot":"","sources":["../../../src/messages/images/list.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.msg.d.ts","sourceRoot":"","sources":["../../../src/messages/images/read.msg.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { defineMicroMessage } from '@hile/micro';
|
|
2
|
+
import { readImageSchema } from '@zlooks.cn/images-shared';
|
|
3
|
+
import readImageModel from '../../models/read-image.model.js';
|
|
4
|
+
import { loadImageModel } from '../model-message.js';
|
|
5
|
+
export default defineMicroMessage(async ({ data, invocation }) => {
|
|
6
|
+
const query = readImageSchema.parse(data);
|
|
7
|
+
return loadImageModel(readImageModel, query, invocation);
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=read.msg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.msg.js","sourceRoot":"","sources":["../../../src/messages/images/read.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.msg.d.ts","sourceRoot":"","sources":["../../../src/messages/images/upload.msg.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { defineMicroMessage } from '@hile/micro';
|
|
2
|
+
import { imageUploadCommandSchema } from '@zlooks.cn/images-shared';
|
|
3
|
+
import uploadImageModel from '../../models/upload-image.model.js';
|
|
4
|
+
import { loadImageModel } from '../model-message.js';
|
|
5
|
+
export default defineMicroMessage(async ({ data, invocation }) => {
|
|
6
|
+
const command = imageUploadCommandSchema.parse(data);
|
|
7
|
+
return loadImageModel(uploadImageModel, command, invocation);
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=upload.msg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.msg.js","sourceRoot":"","sources":["../../../src/messages/images/upload.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,gBAAgB,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,cAAc,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { InvocationContext } from '@hile/context';
|
|
2
|
+
import { type ModelDefinition } from '@hile/model';
|
|
3
|
+
export declare function loadImageModel<TInput extends object, TOutput>(model: ModelDefinition<TInput, TOutput>, input: TInput, invocation: InvocationContext): Promise<TOutput | {
|
|
4
|
+
outcome: "error";
|
|
5
|
+
code: "HASH_CONFLICT" | "IDEMPOTENCY_CONFLICT" | "IMAGE_TOO_LARGE" | "INVALID_BASE64" | "INVALID_CURSOR" | "INVALID_IMAGE" | "INVALID_PATH" | "NOT_FOUND" | "STATE_CONFLICT" | "UPLOAD_NOT_READY";
|
|
6
|
+
message: string;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=model-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-message.d.ts","sourceRoot":"","sources":["../../src/messages/model-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9D,wBAAsB,cAAc,CAAC,MAAM,SAAS,MAAM,EAAE,OAAO,EACjE,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,iBAAiB;;;;GAY9B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { loadModel } from '@hile/model';
|
|
2
|
+
import { imageOperationFailureSchema } from '@zlooks.cn/images-shared';
|
|
3
|
+
import { ImageError } from '../domain/image-error.js';
|
|
4
|
+
export async function loadImageModel(model, input, invocation) {
|
|
5
|
+
try {
|
|
6
|
+
return await loadModel(model, input, invocation);
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
if (!(error instanceof ImageError))
|
|
10
|
+
throw error;
|
|
11
|
+
return imageOperationFailureSchema.parse({
|
|
12
|
+
outcome: 'error',
|
|
13
|
+
code: error.code,
|
|
14
|
+
message: error.message,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=model-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-message.js","sourceRoot":"","sources":["../../src/messages/model-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAwB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAuC,EACvC,KAAa,EACb,UAA6B;IAE7B,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;YAAE,MAAM,KAAK,CAAC;QAChD,OAAO,2BAA2B,CAAC,KAAK,CAAC;YACvC,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { DatabaseMigration } from '@zlooks.cn/database-command';
|
|
2
|
+
import { type DataSource } from 'typeorm';
|
|
2
3
|
export declare const imagesMigrations: readonly DatabaseMigration[];
|
|
4
|
+
export declare function prepareImagesSchema(dataSource: DataSource): Promise<void>;
|
|
3
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AA0C/D,eAAO,MAAM,gBAAgB,EAAE,SAAS,iBAAiB,EAA4B,CAAC;AAEtF,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/E"}
|
package/dist/migrations/index.js
CHANGED
|
@@ -1,3 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { IsNull, TableColumn } from 'typeorm';
|
|
2
|
+
const backfillEventVersions = {
|
|
3
|
+
name: '20260909-backfill-image-event-versions',
|
|
4
|
+
async run(dataSource) {
|
|
5
|
+
const runner = dataSource.createQueryRunner();
|
|
6
|
+
await runner.connect();
|
|
7
|
+
try {
|
|
8
|
+
await runner.startTransaction();
|
|
9
|
+
const table = await runner.getTable('images');
|
|
10
|
+
if (!table) {
|
|
11
|
+
await runner.commitTransaction();
|
|
12
|
+
return 'skipped';
|
|
13
|
+
}
|
|
14
|
+
let versionColumn = table.findColumnByName('version');
|
|
15
|
+
if (versionColumn && !versionColumn.isNullable) {
|
|
16
|
+
await runner.commitTransaction();
|
|
17
|
+
return 'skipped';
|
|
18
|
+
}
|
|
19
|
+
if (!versionColumn) {
|
|
20
|
+
versionColumn = new TableColumn({ name: 'version', type: 'integer', isNullable: true });
|
|
21
|
+
await runner.addColumn('images', versionColumn);
|
|
22
|
+
}
|
|
23
|
+
await runner.manager.createQueryBuilder()
|
|
24
|
+
.update('images')
|
|
25
|
+
.set({ version: 1 })
|
|
26
|
+
.where({ version: IsNull() })
|
|
27
|
+
.execute();
|
|
28
|
+
const requiredVersionColumn = versionColumn.clone();
|
|
29
|
+
requiredVersionColumn.isNullable = false;
|
|
30
|
+
await runner.changeColumn('images', 'version', requiredVersionColumn);
|
|
31
|
+
await runner.commitTransaction();
|
|
32
|
+
return 'applied';
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (runner.isTransactionActive)
|
|
36
|
+
await runner.rollbackTransaction();
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await runner.release();
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export const imagesMigrations = [backfillEventVersions];
|
|
45
|
+
export async function prepareImagesSchema(dataSource) {
|
|
46
|
+
for (const migration of imagesMigrations) {
|
|
47
|
+
await migration.run(dataSource);
|
|
48
|
+
}
|
|
49
|
+
await dataSource.synchronize();
|
|
50
|
+
}
|
|
3
51
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAmB,MAAM,SAAS,CAAC;AAE/D,MAAM,qBAAqB,GAAsB;IAC/C,IAAI,EAAE,wCAAwC;IAC9C,KAAK,CAAC,GAAG,CAAC,UAAsB;QAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC9C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBACjC,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,aAAa,GAAG,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;gBAC/C,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBACjC,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,aAAa,GAAG,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxF,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE;iBACtC,MAAM,CAAC,QAAQ,CAAC;iBAChB,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;iBACnB,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;iBAC5B,OAAO,EAAE,CAAC;YACb,MAAM,qBAAqB,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;YACpD,qBAAqB,CAAC,UAAU,GAAG,KAAK,CAAC;YACzC,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;YACtE,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,mBAAmB;gBAAE,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACnE,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAiC,CAAC,qBAAqB,CAAC,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAsB;IAC9D,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -6,31 +6,38 @@ import { imageProjection } from '../presentation/image-projection.js';
|
|
|
6
6
|
import imagesRuntimeService from '../services/images-runtime.service.js';
|
|
7
7
|
export default defineModel(async (input, invocation) => {
|
|
8
8
|
invocation.signal.throwIfAborted();
|
|
9
|
-
const
|
|
9
|
+
const command = deleteImageSchema.parse(input);
|
|
10
10
|
const { store, storage, origin } = await loadService(imagesRuntimeService);
|
|
11
11
|
invocation.signal.throwIfAborted();
|
|
12
|
-
const row = await store.read(
|
|
13
|
-
if (row.sha256 !==
|
|
12
|
+
const row = await store.read(command.id);
|
|
13
|
+
if (row.sha256 !== command.expectedSha256) {
|
|
14
14
|
throw new ImageError('HASH_CONFLICT', '图片摘要不匹配,删除未执行');
|
|
15
|
+
}
|
|
15
16
|
if (row.status === 'deleted')
|
|
16
17
|
return imageProjection(row, origin());
|
|
17
|
-
if (row.status !== 'ready' && row.status !== 'deleting')
|
|
18
|
+
if (row.status !== 'ready' && row.status !== 'deleting') {
|
|
18
19
|
throw new ImageError('STATE_CONFLICT', '当前图片不可删除');
|
|
20
|
+
}
|
|
19
21
|
invocation.signal.throwIfAborted();
|
|
20
|
-
|
|
22
|
+
const acquiredDeletion = row.status === 'ready'
|
|
23
|
+
? await store.compareAndSet(row.id, 'ready', { status: 'deleting' }, invocation.signal)
|
|
24
|
+
: true;
|
|
25
|
+
if (!acquiredDeletion) {
|
|
21
26
|
const current = await store.read(row.id);
|
|
22
27
|
if (current.status === 'deleted')
|
|
23
28
|
return imageProjection(current, origin());
|
|
24
|
-
if (current.status !== 'deleting')
|
|
29
|
+
if (current.status !== 'deleting') {
|
|
25
30
|
throw new ImageError('STATE_CONFLICT', '图片状态已改变,请重新读取');
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
33
|
// Once origin reads are disabled, finish cleanup even if the caller disconnects.
|
|
28
34
|
if (row.relativePath)
|
|
29
35
|
await storage.remove(row.relativePath);
|
|
30
36
|
await store.compareAndSet(row.id, 'deleting', { status: 'deleted', deletedAt: new Date() });
|
|
31
37
|
const deleted = await store.read(row.id);
|
|
32
|
-
if (deleted.status !== 'deleted')
|
|
38
|
+
if (deleted.status !== 'deleted') {
|
|
33
39
|
throw new ImageError('STATE_CONFLICT', '图片状态已改变,请重新读取');
|
|
40
|
+
}
|
|
34
41
|
return imageProjection(deleted, origin());
|
|
35
42
|
});
|
|
36
43
|
//# sourceMappingURL=delete-image.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-image.model.js","sourceRoot":"","sources":["../../src/models/delete-image.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAyB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAsB,MAAM,qCAAqC,CAAC;AAC1F,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AAEzE,eAAe,WAAW,
|
|
1
|
+
{"version":3,"file":"delete-image.model.js","sourceRoot":"","sources":["../../src/models/delete-image.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAyB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAsB,MAAM,qCAAqC,CAAC;AAC1F,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AAEzE,eAAe,WAAW,CACxB,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;IAC1B,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAC3E,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACpE,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACxD,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IACD,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO;QAC7C,CAAC,CAAC,MAAM,KAAK,CAAC,aAAa,CACzB,GAAG,CAAC,EAAE,EACN,OAAO,EACP,EAAE,MAAM,EAAE,UAAU,EAAE,EACtB,UAAU,CAAC,MAAM,CAClB;QACD,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,iFAAiF;IACjF,IAAI,GAAG,CAAC,YAAY;QAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,KAAK,CAAC,aAAa,CACvB,GAAG,CAAC,EAAE,EACN,UAAU,EACV,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAC7C,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC,CACF,CAAC"}
|
|
@@ -5,11 +5,14 @@ import { imageProjection } from '../presentation/image-projection.js';
|
|
|
5
5
|
import imagesRuntimeService from '../services/images-runtime.service.js';
|
|
6
6
|
export default defineModel(async (input, invocation) => {
|
|
7
7
|
invocation.signal.throwIfAborted();
|
|
8
|
-
const
|
|
8
|
+
const query = listImageSchema.parse(input);
|
|
9
9
|
const { store, origin } = await loadService(imagesRuntimeService);
|
|
10
10
|
invocation.signal.throwIfAborted();
|
|
11
|
-
const result = await store.list(
|
|
11
|
+
const result = await store.list(query);
|
|
12
12
|
invocation.signal.throwIfAborted();
|
|
13
|
-
return {
|
|
13
|
+
return {
|
|
14
|
+
...result,
|
|
15
|
+
items: result.items.map((row) => imageProjection(row, origin())),
|
|
16
|
+
};
|
|
14
17
|
});
|
|
15
18
|
//# sourceMappingURL=list-image.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-image.model.js","sourceRoot":"","sources":["../../src/models/list-image.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"list-image.model.js","sourceRoot":"","sources":["../../src/models/list-image.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAuB,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAkB,MAAM,qCAAqC,CAAC;AACtF,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AAEzE,eAAe,WAAW,CACxB,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;IAC1B,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAClE,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACnC,OAAO;QACL,GAAG,MAAM;QACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;KACjE,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-image-event-catalog.model.d.ts","sourceRoot":"","sources":["../../src/models/read-image-event-catalog.model.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { defineModel } from '@hile/model';
|
|
2
|
+
import { IMAGES_EVENT_CATALOG } from '@zlooks.cn/images-shared';
|
|
3
|
+
export default defineModel(async (_input, invocation) => {
|
|
4
|
+
invocation.signal.throwIfAborted();
|
|
5
|
+
return IMAGES_EVENT_CATALOG;
|
|
6
|
+
});
|
|
7
|
+
//# sourceMappingURL=read-image-event-catalog.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-image-event-catalog.model.js","sourceRoot":"","sources":["../../src/models/read-image-event-catalog.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,eAAe,WAAW,CACxB,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;IAC3B,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACnC,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CACF,CAAC"}
|
|
@@ -5,10 +5,10 @@ import { imageProjection } from '../presentation/image-projection.js';
|
|
|
5
5
|
import imagesRuntimeService from '../services/images-runtime.service.js';
|
|
6
6
|
export default defineModel(async (input, invocation) => {
|
|
7
7
|
invocation.signal.throwIfAborted();
|
|
8
|
-
const
|
|
8
|
+
const query = readImageSchema.parse(input);
|
|
9
9
|
const { store, origin } = await loadService(imagesRuntimeService);
|
|
10
10
|
invocation.signal.throwIfAborted();
|
|
11
|
-
const row = await store.read(
|
|
11
|
+
const row = await store.read(query.id);
|
|
12
12
|
invocation.signal.throwIfAborted();
|
|
13
13
|
return imageProjection(row, origin());
|
|
14
14
|
});
|