Skip to content

Commit

Permalink
Merge branch 'develop' into improvements/federation-refactor-and-tests
Browse files Browse the repository at this point in the history
  • Loading branch information
MarcosSpessatto committed May 31, 2022
2 parents b60edb6 + 88a8e8e commit 9c1d24c
Show file tree
Hide file tree
Showing 51 changed files with 213 additions and 89 deletions.
10 changes: 6 additions & 4 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ nodeLinker: node-modules

plugins:
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: "@yarnpkg/plugin-workspace-tools"
spec: '@yarnpkg/plugin-workspace-tools'
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
spec: '@yarnpkg/plugin-interactive-tools'
- path: .yarn/plugins/@yarnpkg/plugin-engines.cjs
spec: "https://raw.githubusercontent.com/devoto13/yarn-plugin-engines/main/bundles/%40yarnpkg/plugin-engines.js"
spec: 'https://raw.githubusercontent.com/devoto13/yarn-plugin-engines/main/bundles/%40yarnpkg/plugin-engines.js'
- path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
spec: "@yarnpkg/plugin-typescript"
spec: '@yarnpkg/plugin-typescript'

yarnPath: .yarn/releases/yarn-3.2.0.cjs

checksumBehavior: 'update'
7 changes: 4 additions & 3 deletions apps/meteor/app/api/server/helpers/insertUserObject.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { Meteor } from 'meteor/meteor';

import { Users } from '../../../models/server';
import { API } from '../api';

API.helperMethods.set(
'insertUserObject',
function _addUserToObject({ object, userId }: { object: { [key: string]: unknown }; userId: string }) {
Meteor.bindEnvironment(function _addUserToObject({ object, userId }: { object: { [key: string]: unknown }; userId: string }) {
// Maybe `object: { [key: string]: Meteor.User }`?

const user = Users.findOneById(userId);
if (user) {
object.user = {
Expand All @@ -16,5 +17,5 @@ API.helperMethods.set(
}

return object;
},
}),
);
2 changes: 1 addition & 1 deletion apps/meteor/app/api/server/lib/getUploadFormData.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import busboy from 'busboy';

export const getUploadFormData = async ({ request }) =>
new Promise((resolve, reject) => {
const bb = busboy({ headers: request.headers });
const bb = busboy({ headers: request.headers, defParamCharset: 'utf8' });

const fields = {};

Expand Down
38 changes: 20 additions & 18 deletions apps/meteor/app/api/server/v1/im.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,22 +210,23 @@ API.v1.addRoute(

const ourQuery = query ? { rid: room._id, ...query } : { rid: room._id };

const files = await Uploads.find<IUpload & { userId: string }>(ourQuery, {
sort: sort || { name: 1 },
skip: offset,
limit: count,
projection: fields,
})
.map((file): IImFilesObject | (IImFilesObject & { user: Pick<IUser, '_id' | 'name' | 'username'> }) => {
if (file.userId) {
return this.insertUserObject<IImFilesObject & { user: Pick<IUser, '_id' | 'name' | 'username'> }>({
object: { ...file },
userId: file.userId,
});
}
return file;
})
.toArray();
const files = (
await Uploads.find<IUpload & { userId: string }>(ourQuery, {
sort: sort || { name: 1 },
skip: offset,
limit: count,
projection: fields,
}).toArray()
).map((file): IImFilesObject | (IImFilesObject & { user: Pick<IUser, '_id' | 'name' | 'username'> }) => {
if (file.userId) {
return this.insertUserObject<IImFilesObject & { user: Pick<IUser, '_id' | 'name' | 'username'> }>({
object: { ...file },
userId: file.userId,
});
}
return file;
});

const total = await Uploads.find(ourQuery).count();
return API.v1.success({
files,
Expand All @@ -252,14 +253,15 @@ API.v1.addRoute(

const objectParams = {
rid: room._id,
latest: latest ? new Date(latest).toISOString() : new Date().toISOString(),
oldest: oldest && new Date(oldest).toISOString(),
latest: latest ? new Date(latest) : new Date(),
oldest: oldest && new Date(oldest),
inclusive: inclusive === 'true',
offset,
count,
unreads: unreads === 'true',
showThreadMessages: showThreadMessages === 'true',
};

const result = Meteor.call('getChannelHistory', objectParams);

if (!result) {
Expand Down
3 changes: 2 additions & 1 deletion apps/meteor/app/authentication/server/startup/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import './settings';
import { getClientAddress } from '../../../../server/lib/getClientAddress';
import { getNewUserRoles } from '../../../../server/services/user/lib/getNewUserRoles';
import { AppEvents, Apps } from '../../../apps/server/orchestrator';
import { safeGetMeteorUser } from '../../../utils/server/functions/safeGetMeteorUser';

Accounts.config({
forbidClientAccountCreation: true,
Expand Down Expand Up @@ -213,7 +214,7 @@ Accounts.onCreateUser(function (options, user = {}) {
callbacks.run('onCreateUser', options, user);

// App IPostUserCreated event hook
Promise.await(Apps.triggerEvent(AppEvents.IPostUserCreated, { user, performedBy: Meteor.user() }));
Promise.await(Apps.triggerEvent(AppEvents.IPostUserCreated, { user, performedBy: safeGetMeteorUser() }));

return user;
});
Expand Down
3 changes: 2 additions & 1 deletion apps/meteor/app/lib/server/functions/saveUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { checkEmailAvailability, checkUsernameAvailability, setUserAvatar, setEm
import { Users } from '../../../models/server';
import { callbacks } from '../../../../lib/callbacks';
import { AppEvents, Apps } from '../../../apps/server/orchestrator';
import { safeGetMeteorUser } from '../../../utils/server/functions/safeGetMeteorUser';

const MAX_BIO_LENGTH = 260;
const MAX_NICKNAME_LENGTH = 120;
Expand Down Expand Up @@ -420,7 +421,7 @@ export const saveUser = function (userId, userData) {
Apps.triggerEvent(AppEvents.IPostUserUpdated, {
user: userUpdated,
previousUser: oldUserData,
performedBy: Meteor.user(),
performedBy: safeGetMeteorUser(),
}),
);

Expand Down
2 changes: 1 addition & 1 deletion apps/meteor/app/reactions/server/setReaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ async function setReaction(room, user, message, reaction, shouldReact) {
isReacted = true;
}

Promise.await(Apps.triggerEvent(AppEvents.IPostMessageReacted, message, Meteor.user(), reaction, isReacted));
Promise.await(Apps.triggerEvent(AppEvents.IPostMessageReacted, message, user, reaction, isReacted));

msgStream.emit(message.rid, message);
}
Expand Down
29 changes: 29 additions & 0 deletions apps/meteor/app/utils/server/functions/safeGetMeteorUser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { Meteor } from 'meteor/meteor';

const invalidEnvironmentErrorMessage = 'Meteor.userId can only be invoked in method calls or publications.';

/**
* Helper that executes the `Meteor.user()`, but
* supresses errors thrown if the code isn't
* executed inside Meteor's environment
*
* Use this function only if it the code path is
* expected to run out of Meteor's environment and
* is prepared to handle those cases. Otherwise, it
* is advisable to call `Meteor.user()` directly
*
* @returns The current user in the Meteor session, or null if not available
*/
export function safeGetMeteorUser(): Meteor.User | null {
try {
return Meteor.user();
} catch (error: any) {
// This is the only type of error we want to capture and supress,
// so if the error thrown is different from what we expect, we let it go
if (error?.message !== invalidEnvironmentErrorMessage) {
throw error;
}

return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Box, Skeleton } from '@rocket.chat/fuselage';
import { useTranslation } from '@rocket.chat/ui-contexts';
import React, { ReactElement, useMemo } from 'react';

import CounterSet from '../../../components/data/CounterSet';
import CounterSet from '../../../components/dataView/CounterSet';
import { AsyncStatePhase } from '../../../hooks/useAsyncState';
import { usePolledMethodData } from '../../../hooks/usePolledMethodData';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,13 @@ const Message: FC<{ message: IMessage; sequential: boolean; subscription?: ISubs
>
<MessageLeftContainer>
{!sequential && message.u.username && !isSelecting && (
<UserAvatar username={message.u.username} size={'x36'} onClick={openUserCard(message.u.username)} style={{ cursor: 'pointer' }} />
<UserAvatar
url={message.avatar}
username={message.u.username}
size={'x36'}
onClick={openUserCard(message.u.username)}
style={{ cursor: 'pointer' }}
/>
)}
{isSelecting && <CheckBox checked={isSelected} onChange={toggleSelected} />}
{sequential && <MessageIndicators message={message} />}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable complexity */
import { IMessage, isDiscussionMessage, isThreadMainMessage, ISubscription } from '@rocket.chat/core-typings';
import { MessageBody } from '@rocket.chat/fuselage';
import { MessageBody, MessageBlock } from '@rocket.chat/fuselage';
import { useTranslation, useUserId, TranslationKey } from '@rocket.chat/ui-contexts';
import React, { FC, memo } from 'react';

Expand All @@ -12,7 +12,7 @@ import DiscussionMetric from '../../../../components/Message/Metrics/Discussion'
import ThreadMetric from '../../../../components/Message/Metrics/Thread';
import { useUserData } from '../../../../hooks/useUserData';
import { UserPresence } from '../../../../lib/presence';
import MessageBlock from '../../../blocks/MessageBlock';
import MessageBlockUiKit from '../../../blocks/MessageBlock';
import MessageLocation from '../../../location/MessageLocation';
import { useMessageActions, useMessageOembedIsEnabled, useMessageRunActionLink } from '../../contexts/MessageContext';
import { useMessageListShowReadReceipt } from '../contexts/MessageListContext';
Expand Down Expand Up @@ -54,7 +54,11 @@ const MessageContent: FC<{ message: IMessage; sequential: boolean; subscription?
{isEncryptedMessage && message.e2e === 'pending' && t('E2E_message_encrypted_placeholder')}
</MessageBody>
)}
{message.blocks && <MessageBlock mid={message._id} blocks={message.blocks} appId rid={message.rid} />}
{message.blocks && (
<MessageBlock fixedWidth>
<MessageBlockUiKit mid={message._id} blocks={message.blocks} appId rid={message.rid} />
</MessageBlock>
)}
{message.attachments && <Attachments attachments={message.attachments} file={message.file} />}

{oembedIsEnabled && !!message.urls?.length && <PreviewList urls={message.urls} />}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ const MessageHeader: FC<{ message: IMessage }> = ({ message }) => {
onClick={user.username !== undefined ? openUserCard(user.username) : undefined}
style={{ cursor: 'pointer' }}
>
{getUserDisplayName(user.name, user.username, showRealName)}
{message.alias || getUserDisplayName(user.name, user.username, showRealName)}
</MessageName>
{showUsername && (
<MessageUsername
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import { useTranslation } from '@rocket.chat/ui-contexts';
import moment from 'moment';
import React, { ReactElement, useMemo, useState } from 'react';

import Growth from '../../../../../../client/components/data/Growth';
import Growth from '../../../../../../client/components/dataView/Growth';
import Section from '../Section';
import DownloadDataButton from '../data/DownloadDataButton';
import PeriodSelector from '../data/PeriodSelector';
import { usePeriodSelectorState } from '../data/usePeriodSelectorState';
import DownloadDataButton from '../dataView/DownloadDataButton';
import PeriodSelector from '../dataView/PeriodSelector';
import { usePeriodSelectorState } from '../dataView/usePeriodSelectorState';
import { useChannelsList } from './useChannelsList';

const ChannelsTab = (): ReactElement => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useQuery } from 'react-query';

import { getFromRestApi } from '../../../../lib/getFromRestApi';
import { getPeriodRange, Period } from '../data/periods';
import { getPeriodRange, Period } from '../dataView/periods';

type UseChannelsListOptions = {
period: Period['key'];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { Box, ActionButton } from '@rocket.chat/fuselage';
import { useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts';
import React, { ComponentProps, ReactElement } from 'react';

import { useToastMessageDispatch } from '@rocket.chat/ui-contexts';
import { useTranslation } from '@rocket.chat/ui-contexts'
import { downloadCsvAs } from '../../../../../../client/lib/download';

type RowFor<THeaders extends readonly string[]> = readonly unknown[] & {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Select } from '@rocket.chat/fuselage';
import { useTranslation } from '@rocket.chat/ui-contexts';
import React, { ReactElement, useMemo } from 'react';

import { useTranslation } from '@rocket.chat/ui-contexts'
import { getPeriod, Period } from './periods';

type PeriodSelectorProps<TPeriod extends Period['key']> = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { TranslationKey } from '@rocket.chat/ui-contexts';
import moment from 'moment';

import { TranslationKey } from '@rocket.chat/ui-contexts'

const label = (
translationKey: TranslationKey,
...replacements: unknown[]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useTranslation } from '@rocket.chat/ui-contexts';
import { useMemo } from 'react';

import { useTranslation } from '@rocket.chat/ui-contexts'
import { getPeriod, Period } from './periods';

export const usePeriodLabel = (period: Period['key']): string => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import { useTranslation } from '@rocket.chat/ui-contexts';
import React, { ReactElement, useMemo } from 'react';

import Section from '../Section';
import DownloadDataButton from '../data/DownloadDataButton';
import LegendSymbol from '../data/LegendSymbol';
import PeriodSelector from '../data/PeriodSelector';
import { usePeriodSelectorState } from '../data/usePeriodSelectorState';
import DownloadDataButton from '../dataView/DownloadDataButton';
import LegendSymbol from '../dataView/LegendSymbol';
import PeriodSelector from '../dataView/PeriodSelector';
import { usePeriodSelectorState } from '../dataView/usePeriodSelectorState';
import { useMessageOrigins } from './useMessageOrigins';
import { useTopFivePopularChannels } from './useTopFivePopularChannels';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import { useTranslation } from '@rocket.chat/ui-contexts';
import moment from 'moment';
import React, { ReactElement, useMemo } from 'react';

import CounterSet from '../../../../../../client/components/data/CounterSet';
import CounterSet from '../../../../../../client/components/dataView/CounterSet';
import Section from '../Section';
import DownloadDataButton from '../data/DownloadDataButton';
import PeriodSelector from '../data/PeriodSelector';
import { usePeriodLabel } from '../data/usePeriodLabel';
import { usePeriodSelectorState } from '../data/usePeriodSelectorState';
import DownloadDataButton from '../dataView/DownloadDataButton';
import PeriodSelector from '../dataView/PeriodSelector';
import { usePeriodLabel } from '../dataView/usePeriodLabel';
import { usePeriodSelectorState } from '../dataView/usePeriodSelectorState';
import { useMessagesSent } from './useMessagesSent';

const MessagesSentSection = (): ReactElement => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useQuery } from 'react-query';

import { getFromRestApi } from '../../../../lib/getFromRestApi';
import { getPeriodRange, Period } from '../data/periods';
import { getPeriodRange, Period } from '../dataView/periods';

type UseMessageOriginsOptions = { period: Period['key'] };

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useQuery } from 'react-query';

import { getFromRestApi } from '../../../../lib/getFromRestApi';
import { getPeriodRange, Period } from '../data/periods';
import { getPeriodRange, Period } from '../dataView/periods';

type UseMessagesSentOptions = { period: Period['key'] };

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useQuery } from 'react-query';

import { getFromRestApi } from '../../../../lib/getFromRestApi';
import { getPeriodRange, Period } from '../data/periods';
import { getPeriodRange, Period } from '../dataView/periods';

type UseTopFivePopularChannelsOptions = { period: Period['key'] };

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import { useTranslation } from '@rocket.chat/ui-contexts';
import moment from 'moment';
import React, { ReactElement, useMemo } from 'react';

import CounterSet from '../../../../../../client/components/data/CounterSet';
import CounterSet from '../../../../../../client/components/dataView/CounterSet';
import { useFormatDate } from '../../../../../../client/hooks/useFormatDate';
import Section from '../Section';
import DownloadDataButton from '../data/DownloadDataButton';
import LegendSymbol from '../data/LegendSymbol';
import DownloadDataButton from '../dataView/DownloadDataButton';
import LegendSymbol from '../dataView/LegendSymbol';
import { useActiveUsers } from './useActiveUsers';

type ActiveUsersSectionProps = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import { useTranslation } from '@rocket.chat/ui-contexts';
import moment from 'moment';
import React, { ReactElement, useMemo } from 'react';

import CounterSet from '../../../../../../client/components/data/CounterSet';
import CounterSet from '../../../../../../client/components/dataView/CounterSet';
import { useFormatDate } from '../../../../../../client/hooks/useFormatDate';
import Section from '../Section';
import DownloadDataButton from '../data/DownloadDataButton';
import PeriodSelector from '../data/PeriodSelector';
import { usePeriodLabel } from '../data/usePeriodLabel';
import { usePeriodSelectorState } from '../data/usePeriodSelectorState';
import DownloadDataButton from '../dataView/DownloadDataButton';
import PeriodSelector from '../dataView/PeriodSelector';
import { usePeriodLabel } from '../dataView/usePeriodLabel';
import { usePeriodSelectorState } from '../dataView/usePeriodSelectorState';
import { useNewUsers } from './useNewUsers';

const TICK_WIDTH = 45;
Expand Down
Loading

0 comments on commit 9c1d24c

Please sign in to comment.