@qiqb/message-domain 0.0.0-stage → 0.1.3

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.
Files changed (57) hide show
  1. package/README.md +213 -2
  2. package/build/components/DefaultMessageReminderRenderer.d.ts +10 -0
  3. package/build/components/DefaultMessageReminderRenderer.js +29 -0
  4. package/build/components/MessageNavigation.d.ts +7 -0
  5. package/build/components/MessageNavigation.js +192 -0
  6. package/build/components/MessageReminderDisplay.d.ts +21 -0
  7. package/build/components/MessageReminderDisplay.js +353 -0
  8. package/build/components/MessageWorkspace.d.ts +14 -0
  9. package/build/components/MessageWorkspace.js +26 -0
  10. package/build/components/message-navigation.less +89 -0
  11. package/build/components/message-reminder-display.less +367 -0
  12. package/build/components/message-workspace.less +150 -0
  13. package/build/index.d.ts +20 -0
  14. package/build/index.js +17 -0
  15. package/build/pages/inbox/InboxPage.d.ts +2 -0
  16. package/build/pages/inbox/InboxPage.js +257 -0
  17. package/build/pages/inbox/inbox.less +293 -0
  18. package/build/pages/subscription/PersonalSubscriptionPage.d.ts +1 -0
  19. package/build/pages/subscription/PersonalSubscriptionPage.js +6 -0
  20. package/build/pages/subscription/RoleSubscriptionPage.d.ts +1 -0
  21. package/build/pages/subscription/RoleSubscriptionPage.js +5 -0
  22. package/build/pages/subscription/SubscriptionForm.d.ts +16 -0
  23. package/build/pages/subscription/SubscriptionForm.js +111 -0
  24. package/build/pages/subscription/SubscriptionPage.d.ts +5 -0
  25. package/build/pages/subscription/SubscriptionPage.js +273 -0
  26. package/build/pages/subscription/subscription-form.less +341 -0
  27. package/build/pages/subscription/subscription.less +250 -0
  28. package/build/pages/topic/TopicPage.d.ts +1 -0
  29. package/build/pages/topic/TopicPage.js +275 -0
  30. package/build/routes.cjs +38 -0
  31. package/build/routes.d.cts +22 -0
  32. package/build/routes.d.ts +22 -0
  33. package/build/routes.js +34 -0
  34. package/build/runtime/MessageReminderLayout.d.ts +14 -0
  35. package/build/runtime/MessageReminderLayout.js +25 -0
  36. package/build/runtime/MessageReminders.d.ts +16 -0
  37. package/build/runtime/MessageReminders.js +364 -0
  38. package/build/runtime/index.d.ts +77 -0
  39. package/build/runtime/index.js +103 -0
  40. package/build/runtime/message-reminder-layout.less +40 -0
  41. package/build/runtime/messageRealtime.d.ts +15 -0
  42. package/build/runtime/messageRealtime.js +99 -0
  43. package/build/runtime/reminderEvents.d.ts +18 -0
  44. package/build/runtime/reminderEvents.js +53 -0
  45. package/build/runtime/reminderOwnership.d.ts +35 -0
  46. package/build/runtime/reminderOwnership.js +135 -0
  47. package/build/runtime/reminderPresentation.d.ts +34 -0
  48. package/build/runtime/reminderPresentation.js +57 -0
  49. package/build/runtime/reminderQuery.d.ts +18 -0
  50. package/build/runtime/reminderQuery.js +33 -0
  51. package/build/runtime/reminderQueue.d.ts +25 -0
  52. package/build/runtime/reminderQueue.js +88 -0
  53. package/build/services/MessageController.d.ts +108 -0
  54. package/build/services/MessageController.js +42 -0
  55. package/build/types/index.d.ts +12 -0
  56. package/build/types/index.js +1 -0
  57. package/package.json +95 -4
@@ -0,0 +1,108 @@
1
+ import type { PageInfo, WebResp } from '../types/index.js';
2
+ /** 提醒方式与消息级别相互独立,发布方按主题配置生成新消息的展示快照。 */
3
+ export type MessageReminderMode = 'FULLSCREEN' | 'CAROUSEL' | 'FLOATING';
4
+ export type MessageLevel = 'NORMAL' | 'IMPORTANT' | 'SEVERE';
5
+ export interface MessageTopic {
6
+ id: string;
7
+ code: string;
8
+ name: string;
9
+ sourceSystem: string;
10
+ enabled: boolean;
11
+ /** 模式由服务端注册并返回选项,保留 string 以支持宿主扩展订阅策略。 */
12
+ subscriptionMode: string;
13
+ /** 旧主题响应可能缺少该字段,页面兼容为 FLOATING(浮动通知)。 */
14
+ reminderMode?: MessageReminderMode;
15
+ /** 与提醒方式自由组合,旧主题兼容为 NORMAL(普通)。 */
16
+ messageLevel?: MessageLevel;
17
+ description?: string;
18
+ }
19
+ export interface MessageCondition {
20
+ field: string;
21
+ operator: string;
22
+ values: string[];
23
+ }
24
+ export type SubscriptionScope = 'PERSONAL' | 'ROLE';
25
+ export interface MessageSubscription {
26
+ id: string;
27
+ name: string;
28
+ topicCode: string;
29
+ topicName?: string;
30
+ subjectType: 'ACCOUNT' | 'ROLE';
31
+ subjectId?: string;
32
+ subjectName?: string;
33
+ enabled: boolean;
34
+ conditions: MessageCondition[];
35
+ channels: string[];
36
+ }
37
+ export interface MessageOption {
38
+ code: string;
39
+ name: string;
40
+ }
41
+ export interface MessageRole {
42
+ id: string;
43
+ name: string;
44
+ /** 平台角色投影不一定提供编码,显示时以名称为准。 */
45
+ code?: string;
46
+ }
47
+ export interface SubscriptionMetadata {
48
+ subjectTypes: MessageOption[];
49
+ operators: MessageOption[];
50
+ channels: MessageOption[];
51
+ }
52
+ export interface InboxMessage {
53
+ id: string;
54
+ /** 部分投影只提供 id;读取收件标识时统一 receiptId || id。 */
55
+ receiptId?: string;
56
+ messageId: string;
57
+ topicCode: string;
58
+ topicName?: string;
59
+ sourceSystem: string;
60
+ title: string;
61
+ content: string;
62
+ businessId?: string;
63
+ businessType?: string;
64
+ targetPath?: string;
65
+ readAt?: string;
66
+ createTime?: string;
67
+ occurredAt?: string;
68
+ expiresAt?: string;
69
+ /** 保存发布时的提醒方式;主题后续修改不应改变历史消息的展示快照。 */
70
+ reminderMode?: MessageReminderMode;
71
+ /** 保存发布时的消息级别;旧消息可能尚未返回该字段。 */
72
+ messageLevel?: MessageLevel;
73
+ }
74
+ export declare function showMessageError(error: unknown, fallback: string): void;
75
+ export declare const pageMessageTopics: (params: Record<string, unknown>) => Promise<WebResp<PageInfo<MessageTopic>>>;
76
+ export declare const getMessageTopics: () => Promise<WebResp<MessageTopic[]>>;
77
+ export declare const getMessageSubscriptionModes: () => Promise<WebResp<MessageOption[]>>;
78
+ export declare const saveMessageTopic: (data: Omit<MessageTopic, "id"> & {
79
+ id?: string;
80
+ }) => Promise<WebResp<MessageTopic>>;
81
+ export declare const removeMessageTopic: (id: string) => Promise<WebResp<void>>;
82
+ /** 按主题当前订阅策略补齐账户订阅,服务端保留已有订阅的启停状态。 */
83
+ export declare const syncMessageTopicSubscriptions: (id: string) => Promise<WebResp<{
84
+ createdCount: number;
85
+ }>>;
86
+ export declare const pageMessageSubscriptions: (params: Record<string, unknown> & {
87
+ scope: SubscriptionScope;
88
+ }) => Promise<WebResp<PageInfo<MessageSubscription>>>;
89
+ export declare const saveMessageSubscription: (data: Omit<MessageSubscription, "id"> & {
90
+ id?: string;
91
+ }) => Promise<WebResp<MessageSubscription>>;
92
+ export declare const removeMessageSubscription: (id: string) => Promise<WebResp<void>>;
93
+ export declare const setMessageSubscriptionEnabled: (id: string, enabled: boolean) => Promise<WebResp<void>>;
94
+ export declare const getMessageRoles: (keyword?: string) => Promise<WebResp<MessageRole[]>>;
95
+ export declare const getSubscriptionMetadata: () => Promise<WebResp<SubscriptionMetadata>>;
96
+ export declare const pageInboxMessages: (params: Record<string, unknown>) => Promise<WebResp<PageInfo<InboxMessage>>>;
97
+ export declare const getInboxMessage: (id: string) => Promise<WebResp<InboxMessage>>;
98
+ /** 全局提醒只读取当前账号未读、未过期的收件记录,不会自动更改阅读状态。 */
99
+ export declare const getMessageReminders: (params: {
100
+ current: number;
101
+ pageSize: number;
102
+ }) => Promise<WebResp<PageInfo<InboxMessage>>>;
103
+ export declare const getUnreadMessageCount: () => Promise<WebResp<{
104
+ count: number;
105
+ }>>;
106
+ export declare const markInboxMessageRead: (id: string) => Promise<WebResp<void>>;
107
+ /** 业务消息只能指向站内绝对路径,拒绝协议相对地址、反斜线和控制字符。 */
108
+ export declare function isInternalMessagePath(path?: string): path is string;
@@ -0,0 +1,42 @@
1
+ import { message } from 'antd';
2
+ import { getMessageDomainRuntime, request } from '../runtime/index.js';
3
+ /** 页面集中处理失败反馈,避免宿主全局提示和本模块提示重复弹出。 */
4
+ async function messageRequest(path, method, data) {
5
+ const response = await request(`${getMessageDomainRuntime().apiPrefix}${path}`, {
6
+ method,
7
+ skipErrorHandler: true,
8
+ ...(method === 'GET' ? { params: data } : { data }),
9
+ });
10
+ if (!response.success)
11
+ throw new Error(response.message || '消息服务请求失败');
12
+ return response;
13
+ }
14
+ export function showMessageError(error, fallback) {
15
+ message.error(error instanceof Error && error.message ? error.message : fallback);
16
+ }
17
+ export const pageMessageTopics = (params) => messageRequest('/topic/page', 'POST', params);
18
+ export const getMessageTopics = () => messageRequest('/topic/options', 'GET');
19
+ export const getMessageSubscriptionModes = () => messageRequest('/topic/subscription_modes', 'GET');
20
+ export const saveMessageTopic = (data) => messageRequest('/topic/save', 'POST', data);
21
+ export const removeMessageTopic = (id) => messageRequest('/topic/remove', 'POST', { id });
22
+ /** 按主题当前订阅策略补齐账户订阅,服务端保留已有订阅的启停状态。 */
23
+ export const syncMessageTopicSubscriptions = (id) => messageRequest('/topic/sync_subscriptions', 'POST', { id });
24
+ export const pageMessageSubscriptions = (params) => messageRequest('/subscription/page', 'POST', params);
25
+ export const saveMessageSubscription = (data) => messageRequest('/subscription/save', 'POST', data);
26
+ export const removeMessageSubscription = (id) => messageRequest('/subscription/remove', 'POST', { id });
27
+ export const setMessageSubscriptionEnabled = (id, enabled) => messageRequest('/subscription/set_enabled', 'POST', { id, enabled });
28
+ export const getMessageRoles = (keyword) => messageRequest('/subscription/roles', 'GET', { keyword });
29
+ export const getSubscriptionMetadata = () => messageRequest('/subscription/metadata', 'GET');
30
+ export const pageInboxMessages = (params) => messageRequest('/inbox/page', 'POST', params);
31
+ export const getInboxMessage = (id) => messageRequest('/inbox/detail_info', 'GET', { id });
32
+ /** 全局提醒只读取当前账号未读、未过期的收件记录,不会自动更改阅读状态。 */
33
+ export const getMessageReminders = (params) => messageRequest('/inbox/reminders', 'GET', params);
34
+ export const getUnreadMessageCount = () => messageRequest('/inbox/unread_count', 'GET');
35
+ export const markInboxMessageRead = (id) => messageRequest('/inbox/mark_read', 'POST', { id });
36
+ /** 业务消息只能指向站内绝对路径,拒绝协议相对地址、反斜线和控制字符。 */
37
+ export function isInternalMessagePath(path) {
38
+ return (!!path &&
39
+ path.startsWith('/') &&
40
+ !path.startsWith('//') &&
41
+ !/[\\\u0000-\u001f\u007f]/.test(path));
42
+ }
@@ -0,0 +1,12 @@
1
+ /** 消息领域自有的标准响应投影,避免依赖任一业务宿主的 shared 包。 */
2
+ export interface PageInfo<D> {
3
+ current?: number;
4
+ size?: number;
5
+ total: number;
6
+ records?: D[];
7
+ }
8
+ export interface WebResp<T> {
9
+ success: boolean;
10
+ message?: string;
11
+ data?: T;
12
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,97 @@
1
1
  {
2
2
  "name": "@qiqb/message-domain",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.3",
4
+ "description": "与宿主框架无关的 QIQB 消息主题、订阅、收件箱与全局提醒领域包",
5
+ "sideEffects": [
6
+ "**/*.less"
7
+ ],
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./build/index.d.ts",
12
+ "default": "./build/index.js"
13
+ },
14
+ "./runtime": {
15
+ "types": "./build/runtime/index.d.ts",
16
+ "default": "./build/runtime/index.js"
17
+ },
18
+ "./routes": {
19
+ "types": "./build/routes.d.ts",
20
+ "import": {
21
+ "types": "./build/routes.d.ts",
22
+ "default": "./build/routes.js"
23
+ },
24
+ "require": {
25
+ "types": "./build/routes.d.cts",
26
+ "default": "./build/routes.cjs"
27
+ },
28
+ "default": "./build/routes.js"
29
+ },
30
+ "./types": {
31
+ "types": "./build/types/index.d.ts",
32
+ "default": "./build/types/index.js"
33
+ },
34
+ "./pages/*": {
35
+ "types": "./build/pages/*.d.ts",
36
+ "default": "./build/pages/*.js"
37
+ },
38
+ "./services/*": {
39
+ "types": "./build/services/*.d.ts",
40
+ "default": "./build/services/*.js"
41
+ },
42
+ "./components/*": {
43
+ "types": "./build/components/*.d.ts",
44
+ "default": "./build/components/*.js"
45
+ },
46
+ "./runtime/*": {
47
+ "types": "./build/runtime/*.d.ts",
48
+ "default": "./build/runtime/*.js"
49
+ },
50
+ "./styles/*": "./build/*.less",
51
+ "./package.json": "./package.json"
52
+ },
53
+ "main": "./build/index.js",
54
+ "types": "./build/index.d.ts",
55
+ "files": [
56
+ "build",
57
+ "README.md"
58
+ ],
59
+ "scripts": {
60
+ "build": "node scripts/build.mjs",
61
+ "lint": "tsc -p tsconfig.json --noEmit",
62
+ "pack:local": "npm pack --pack-destination /private/tmp",
63
+ "publish:local": "node ../scripts/publish-platform-domain.mjs --package message-domain --target local",
64
+ "publish:nexus": "node ../scripts/publish-platform-domain.mjs --package message-domain --target nexus",
65
+ "publish:private": "node ../scripts/publish-platform-domain.mjs --package message-domain --target all",
66
+ "test:reminders": "node scripts/reminder-regression.cjs",
67
+ "test:routes": "node scripts/routes-entry-regression.cjs",
68
+ "test:runtime": "node scripts/runtime-regression.cjs",
69
+ "test:presentation": "node scripts/presentation-regression.cjs",
70
+ "test:display": "node scripts/display-regression.cjs",
71
+ "test:navigation": "node scripts/navigation-regression.cjs",
72
+ "test:realtime": "node scripts/realtime-regression.cjs",
73
+ "publish:official": "node ../scripts/publish-platform-domain.mjs --package message-domain --target official"
74
+ },
75
+ "devDependencies": {
76
+ "@ant-design/icons": "^6.2.2",
77
+ "@ant-design/pro-components": "3.1.12-0",
78
+ "@types/node": "^20.0.0",
79
+ "@types/react": "^18.0.33",
80
+ "@types/react-dom": "^18.0.11",
81
+ "antd": "^6.3.7",
82
+ "react": "18.3.1",
83
+ "react-dom": "18.3.1",
84
+ "typescript": "^5.6.0"
85
+ },
86
+ "peerDependencies": {
87
+ "@ant-design/icons": ">=5.0.0 <7.0.0",
88
+ "@ant-design/pro-components": ">=2.8.0 <4.0.0",
89
+ "antd": ">=5.0.0 <7.0.0",
90
+ "react": ">=18.0.0 <20.0.0",
91
+ "react-dom": ">=18.0.0 <20.0.0"
92
+ },
93
+ "publishConfig": {
94
+ "access": "public",
95
+ "registry": "https://registry.npmjs.org/"
96
+ }
97
+ }