-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Expand file tree
/
Copy pathannouncementSync.ts
More file actions
132 lines (117 loc) · 3.86 KB
/
announcementSync.ts
File metadata and controls
132 lines (117 loc) · 3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import { type Cloud, type Serialized } from '@rocket.chat/core-typings';
import { serverFetch as fetch } from '@rocket.chat/server-fetch';
import { z } from 'zod';
import { CloudWorkspaceConnectionError } from '../../../../../lib/errors/CloudWorkspaceConnectionError';
import { CloudWorkspaceRegistrationError } from '../../../../../lib/errors/CloudWorkspaceRegistrationError';
import { SystemLogger } from '../../../../../server/lib/logger/system';
import { settings } from '../../../../settings/server';
import { buildWorkspaceRegistrationData } from '../buildRegistrationData';
import { CloudWorkspaceAccessTokenEmptyError, getWorkspaceAccessToken } from '../getWorkspaceAccessToken';
import { retrieveRegistrationStatus } from '../retrieveRegistrationStatus';
import { handleAnnouncementsOnWorkspaceSync, handleNpsOnWorkspaceSync } from './handleCommsSync';
const workspaceCommPayloadSchema = z.object({
workspaceId: z.string().optional(),
publicKey: z.string().optional(),
nps: z
.object({
id: z.string(),
startAt: z.string().datetime(),
expireAt: z.string().datetime(),
})
.optional(),
announcements: z.object({
create: z.array(
z.object({
_id: z.string(),
_updatedAt: z.string().datetime().optional(),
selector: z.object({
roles: z.array(z.string()),
}),
platform: z.array(z.enum(['web', 'mobile'])),
expireAt: z.string().datetime(),
startAt: z.string().datetime(),
createdBy: z.enum(['cloud', 'system']),
createdAt: z.string().datetime(),
dictionary: z.record(z.record(z.string())).optional(),
view: z.unknown(),
surface: z.enum(['banner', 'modal']),
}),
),
delete: z.array(z.string()).optional(),
}),
});
const fetchCloudAnnouncementsSync = async ({
token,
data,
}: {
token: string;
data: Cloud.WorkspaceSyncRequestPayload;
}): Promise<Serialized<Cloud.WorkspaceCommsResponsePayload>> => {
const cloudUrl = settings.get<string>('Cloud_Url');
const response = await fetch(`${cloudUrl}/api/v3/comms/workspace`, {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
},
body: data,
});
if (!response.ok) {
try {
const { error } = await response.json();
throw new CloudWorkspaceConnectionError(`Failed to connect to Rocket.Chat Cloud: ${error}`);
} catch (error) {
throw new CloudWorkspaceConnectionError(`Failed to connect to Rocket.Chat Cloud: ${response.statusText}`);
}
}
const payload = await response.json();
const assertWorkspaceCommPayload = workspaceCommPayloadSchema.safeParse(payload);
if (!assertWorkspaceCommPayload.success) {
console.error('workspaceCommPayloadSchema failed type validation', assertWorkspaceCommPayload.error.errors);
}
return payload;
};
export async function announcementSync() {
try {
const { workspaceRegistered } = await retrieveRegistrationStatus();
if (!workspaceRegistered) {
throw new CloudWorkspaceRegistrationError('Workspace is not registered');
}
const token = await getWorkspaceAccessToken(true);
if (!token) {
throw new CloudWorkspaceAccessTokenEmptyError();
}
const workspaceRegistrationData = await buildWorkspaceRegistrationData(undefined);
const { nps, announcements } = await fetchCloudAnnouncementsSync({
token,
data: workspaceRegistrationData,
});
if (nps) {
await handleNpsOnWorkspaceSync(nps);
}
if (announcements) {
await handleAnnouncementsOnWorkspaceSync(announcements);
}
return true;
} catch (err) {
switch (true) {
case err instanceof CloudWorkspaceConnectionError:
case err instanceof CloudWorkspaceRegistrationError:
case err instanceof CloudWorkspaceAccessTokenEmptyError: {
SystemLogger.info({
msg: 'Failed to sync with Rocket.Chat Cloud',
function: 'announcementSync',
err,
});
break;
}
default: {
SystemLogger.error({
msg: 'Error during workspace sync',
function: 'announcementSync',
err,
});
}
}
throw err;
}
}