Skip to content

Commit d647e96

Browse files
ggazzoclaude
andcommitted
chore: migrate simple server-side moment usages to date-fns
Mechanical replacements across server code: moment() → new Date(), .diff() → date-fns utilities, .format() → Intl.DateTimeFormat/format(), dependency updates. No complex timezone logic changes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9760d84 commit d647e96

46 files changed

Lines changed: 152 additions & 213 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/meteor/app/cloud/server/functions/buildRegistrationData.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { LivechatContacts, Statistics, Users } from '@rocket.chat/models';
2-
import moment from 'moment';
2+
import { format } from 'date-fns';
33

44
import { settings } from '../../../settings/server';
55
import { statistics } from '../../../statistics/server';
@@ -69,7 +69,7 @@ export async function buildWorkspaceRegistrationData<T extends string | undefine
6969
const workspaceType = settings.get<string>('Server_Type');
7070

7171
const seats = await Users.getActiveLocalUserCount();
72-
const MAC = await LivechatContacts.countContactsOnPeriod(moment.utc().format('YYYY-MM'));
72+
const MAC = await LivechatContacts.countContactsOnPeriod(format(new Date(), 'yyyy-MM'));
7373

7474
const license = settings.get<string>('Enterprise_License');
7575

apps/meteor/app/irc/server/irc-bridge/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Logger } from '@rocket.chat/logger';
22
import { Settings } from '@rocket.chat/models';
3-
import moment from 'moment';
43
import Queue from 'queue-fifo';
54

65
import { withThrottling } from '../../../../lib/utils/highOrderFunctions';
@@ -60,7 +59,7 @@ class Bridge {
6059

6160
const lastPing = await Settings.findOneById('IRC_Bridge_Last_Ping');
6261
if (lastPing) {
63-
if (Math.abs(moment(lastPing.value).diff()) < 1000 * 30) {
62+
if (Math.abs(new Date(lastPing.value).getTime() - Date.now()) < 1000 * 30) {
6463
this.log('Not trying to connect.');
6564
this.remove();
6665
return;

apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import type { IMessage, IRoom, IUser, RoomType } from '@rocket.chat/core-typings
22
import { isEditedMessage } from '@rocket.chat/core-typings';
33
import type { Updater } from '@rocket.chat/models';
44
import { Subscriptions, Rooms } from '@rocket.chat/models';
5-
import moment from 'moment';
65

76
import {
87
notifyOnSubscriptionChanged,
@@ -165,7 +164,7 @@ export async function updateThreadUsersSubscriptions(message: IMessage, replies:
165164
export async function notifyUsersOnMessage(message: IMessage, room: IRoom, roomUpdater: Updater<IRoom>): Promise<IMessage> {
166165
// Skips this callback if the message was edited and increments it if the edit was way in the past (aka imported)
167166
if (isEditedMessage(message)) {
168-
if (Math.abs(moment(message.editedAt).diff(Date.now())) > 60000) {
167+
if (Math.abs(new Date(message.editedAt).getTime() - Date.now()) > 60000) {
169168
// TODO: Review as I am not sure how else to get around this as the incrementing of the msgs count shouldn't be in this callback
170169
Rooms.getIncMsgCountUpdateQuery(1, roomUpdater);
171170
return message;
@@ -183,7 +182,7 @@ export async function notifyUsersOnMessage(message: IMessage, room: IRoom, roomU
183182
return message;
184183
}
185184

186-
if (message.ts && Math.abs(moment(message.ts).diff(Date.now())) > 60000) {
185+
if (message.ts && Math.abs(new Date(message.ts).getTime() - Date.now()) > 60000) {
187186
Rooms.getIncMsgCountUpdateQuery(1, roomUpdater);
188187
return message;
189188
}

apps/meteor/app/lib/server/lib/processDirectEmail.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { IMessage } from '@rocket.chat/core-typings';
22
import { Messages, Subscriptions, Users, Rooms } from '@rocket.chat/models';
33
import type { ParsedMail } from 'mailparser';
4-
import moment from 'moment';
54

65
import { canAccessRoomAsync } from '../../../authorization/server';
76
import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission';
@@ -25,7 +24,7 @@ export const processDirectEmail = async function (email: ParsedMail): Promise<vo
2524

2625
const ts = new Date(email.date);
2726

28-
const tsDiff = Math.abs(moment(ts).diff(new Date()));
27+
const tsDiff = Math.abs(ts.getTime() - Date.now());
2928

3029
let msg = email.text.split('\n\n').join('\n');
3130

apps/meteor/app/lib/server/lib/sendNotificationsOnMessage.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
} from '@rocket.chat/core-typings';
1010
import { Subscriptions, Users } from '@rocket.chat/models';
1111
import emojione from 'emojione';
12-
import moment from 'moment';
1312
import type { RootFilterOperators } from 'mongodb';
1413

1514
import { getMentions } from './notifyUsersOnMessage';
@@ -395,7 +394,7 @@ export async function sendAllNotifications(message: IMessage, room: IRoom) {
395394
return message;
396395
}
397396

398-
if (message.ts && Math.abs(moment(message.ts).diff(new Date())) > 60000) {
397+
if (message.ts && Math.abs(new Date(message.ts).getTime() - Date.now()) > 60000) {
399398
return message;
400399
}
401400

apps/meteor/app/lib/server/methods/sendMessage.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { Messages, Users } from '@rocket.chat/models';
77
import type { TOptions } from 'i18next';
88
import { check, Match } from 'meteor/check';
99
import { Meteor } from 'meteor/meteor';
10-
import moment from 'moment';
1110

1211
import { i18n } from '../../../../server/lib/i18n';
1312
import { SystemLogger } from '../../../../server/lib/logger/system';
@@ -50,7 +49,7 @@ export async function executeSendMessage(
5049
const now = new Date();
5150
message.ts = extraInfo?.ts ?? message.ts ?? now;
5251
if (isTimestampFromClient) {
53-
const tsDiff = Math.abs(moment(message.ts).diff(Date.now()));
52+
const tsDiff = Math.abs(new Date(message.ts).getTime() - Date.now());
5453
if (tsDiff > 60000) {
5554
throw new Meteor.Error('error-message-ts-out-of-sync', 'Message timestamp is out of sync', {
5655
method: 'sendMessage',

apps/meteor/app/lib/server/methods/updateMessage.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type { IEditedMessage, IMessage, IUser, AtLeast } from '@rocket.chat/core-typings';
22
import type { ServerMethods } from '@rocket.chat/ddp-client';
33
import { Messages, Users } from '@rocket.chat/models';
4+
import { differenceInMinutes } from 'date-fns';
45
import { Match, check } from 'meteor/check';
56
import { Meteor } from 'meteor/meteor';
6-
import moment from 'moment';
77

88
import { canSendMessageAsync } from '../../../authorization/server/functions/canSendMessage';
99
import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission';
@@ -65,13 +65,9 @@ export async function executeUpdateMessage(
6565

6666
if (!bypassBlockTimeLimit && Match.test(blockEditInMinutes, Number) && blockEditInMinutes !== 0) {
6767
let currentTsDiff = 0;
68-
let msgTs;
6968

7069
if (originalMessage.ts instanceof Date || Match.test(originalMessage.ts, Number)) {
71-
msgTs = moment(originalMessage.ts);
72-
}
73-
if (msgTs) {
74-
currentTsDiff = moment().diff(msgTs, 'minutes');
70+
currentTsDiff = differenceInMinutes(new Date(), originalMessage.ts);
7571
}
7672
if (currentTsDiff >= blockEditInMinutes) {
7773
throw new Meteor.Error('error-message-editing-blocked', 'Message editing is blocked', {

apps/meteor/app/lib/server/startup/mentionUserNotInChannel.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { isDirectMessageRoom, isEditedMessage, isOmnichannelRoom, isRoomFederate
44
import { Subscriptions, Users } from '@rocket.chat/models';
55
import { isTruthy } from '@rocket.chat/tools';
66
import type { ActionsBlock } from '@rocket.chat/ui-kit';
7-
import moment from 'moment';
87

98
import { callbacks } from '../../../../server/lib/callbacks';
109
import { i18n } from '../../../../server/lib/i18n';
@@ -57,7 +56,7 @@ callbacks.add(
5756
// TODO: check if I need to test this 60 second rule.
5857
// If the message was edited, or is older than 60 seconds (imported)
5958
// the notifications will be skipped, so we can also skip this validation
60-
if (isEditedMessage(message) || (message.ts && Math.abs(moment(message.ts).diff(moment())) > 60000) || !message.mentions) {
59+
if (isEditedMessage(message) || (message.ts && Math.abs(new Date(message.ts).getTime() - Date.now()) > 60000) || !message.mentions) {
6160
return message;
6261
}
6362

apps/meteor/app/livechat/server/hooks/markRoomResponded.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { IOmnichannelRoom, IMessage } from '@rocket.chat/core-typings';
22
import { isEditedMessage, isMessageFromVisitor, isSystemMessage } from '@rocket.chat/core-typings';
33
import type { Updater } from '@rocket.chat/models';
44
import { LivechatRooms, LivechatContacts, LivechatInquiry } from '@rocket.chat/models';
5-
import moment from 'moment';
5+
import { format } from 'date-fns';
66

77
import { callbacks } from '../../../../server/lib/callbacks';
88
import { notifyOnLivechatInquiryChanged } from '../../../lib/server/lib/notifyListener';
@@ -23,7 +23,7 @@ export async function markRoomResponded(
2323
return;
2424
}
2525

26-
const monthYear = moment().format('YYYY-MM');
26+
const monthYear = format(new Date(), 'yyyy-MM');
2727
const isContactActive = await LivechatContacts.isContactActiveOnPeriod({ visitorId: room.v._id, source: room.source }, monthYear);
2828

2929
// Case: agent answers & visitor is not active, we mark visitor as active

apps/meteor/app/smarsh-connector/server/functions/generateEml.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { MessageTypes } from '@rocket.chat/message-types';
22
import { Messages, SmarshHistory, Users, Rooms } from '@rocket.chat/models';
3+
import { differenceInMinutes } from 'date-fns';
34
import { Meteor } from 'meteor/meteor';
4-
import moment from 'moment-timezone';
55

66
import { sendEmail } from './sendEmail';
77
import { i18n } from '../../../../server/lib/i18n';
@@ -51,7 +51,7 @@ export const generateEml = async (): Promise<void> => {
5151
users: [],
5252
msgs: 0,
5353
files: [],
54-
time: smarshHistory ? moment(date).diff(moment(smarshHistory.lastRan), 'minutes') : moment(date).diff(moment(room.ts), 'minutes'),
54+
time: smarshHistory ? differenceInMinutes(date, smarshHistory.lastRan) : differenceInMinutes(date, room.ts ?? new Date()),
5555
room: room.name ? `#${room.name}` : `Direct Message Between: ${room?.usernames?.join(' & ')}`,
5656
};
5757

@@ -62,7 +62,22 @@ export const generateEml = async (): Promise<void> => {
6262

6363
// The timestamp
6464
rows.push(open20td);
65-
rows.push(moment(message.ts).tz(timeZone).format('YYYY-MM-DD HH-mm-ss z'));
65+
rows.push(
66+
new Intl.DateTimeFormat('en-US', {
67+
timeZone,
68+
year: 'numeric',
69+
month: '2-digit',
70+
day: '2-digit',
71+
hour: '2-digit',
72+
minute: '2-digit',
73+
second: '2-digit',
74+
timeZoneName: 'short',
75+
hour12: false,
76+
})
77+
.format(new Date(message.ts))
78+
.replace(/\//g, '-')
79+
.replace(/, /g, ' '),
80+
);
6681
rows.push(closetd);
6782

6883
// The sender

0 commit comments

Comments
 (0)