diff --git a/app/api/server/v1/teams.ts b/app/api/server/v1/teams.ts index b6ff8b7574010..ac2ab3586a3f1 100644 --- a/app/api/server/v1/teams.ts +++ b/app/api/server/v1/teams.ts @@ -8,8 +8,9 @@ import { Rooms, Subscriptions } from '../../../models/server'; API.v1.addRoute('teams.list', { authRequired: true }, { get() { const { offset, count } = this.getPaginationItems(); + const { sort, query } = this.parseJsonQuery(); - const { records, total } = Promise.await(Team.list(this.userId, { offset, count })); + const { records, total } = Promise.await(Team.list(this.userId, { offset, count }, { sort, query })); return API.v1.success({ teams: records, diff --git a/app/models/server/raw/Team.ts b/app/models/server/raw/Team.ts index ac5aed80b48d4..b6143aab82840 100644 --- a/app/models/server/raw/Team.ts +++ b/app/models/server/raw/Team.ts @@ -1,4 +1,4 @@ -import { Collection, FindOneOptions, Cursor, UpdateWriteOpResult, DeleteWriteOpResultObject } from 'mongodb'; +import { Collection, FindOneOptions, Cursor, UpdateWriteOpResult, DeleteWriteOpResultObject, FilterQuery } from 'mongodb'; import { BaseRaw } from './BaseRaw'; import { ITeam } from '../../../../definition/ITeam'; @@ -22,8 +22,8 @@ export class TeamRaw extends BaseRaw { return this.col.find({ name: { $in: names } }, options); } - findByIds(ids: Array, options?: FindOneOptions): Cursor { - return this.col.find({ _id: { $in: ids } }, options); + findByIds(ids: Array, options?: FindOneOptions, query?: FilterQuery): Cursor { + return this.col.find({ _id: { $in: ids }, ...query }, options); } findByIdsAndType(ids: Array, type: number, options?: FindOneOptions): Cursor { diff --git a/definition/ITeam.ts b/definition/ITeam.ts index 50d4affd7ff74..44e7aeef28a49 100644 --- a/definition/ITeam.ts +++ b/definition/ITeam.ts @@ -1,3 +1,5 @@ +import { SortOptionObject, FilterQuery, SchemaMember } from 'mongodb'; + import { IRocketChatRecord } from './IRocketChatRecord'; import { IUser } from './IUser'; @@ -6,6 +8,8 @@ export enum TEAM_TYPE { PRIVATE = 1, } +export type SortType = -1|1; + export interface ITeam extends IRocketChatRecord { name: string; type: TEAM_TYPE; @@ -28,6 +32,13 @@ export interface IPaginationOptions { count: number; } +// TODO move this definition to a more broader file +export interface IQueryOptions { + sort: SortOptionObject; + query?: FilterQuery; + fields?: SchemaMember; +} + // TODO move this definition to a more broader file export interface IRecordsWithTotal { records: Array; diff --git a/server/sdk/types/ITeamService.ts b/server/sdk/types/ITeamService.ts index d8b8183e2ef23..593ececa3e537 100644 --- a/server/sdk/types/ITeamService.ts +++ b/server/sdk/types/ITeamService.ts @@ -1,6 +1,6 @@ import { FindOneOptions } from 'mongodb'; -import { ITeam, IRecordsWithTotal, IPaginationOptions } from '../../../definition/ITeam'; +import { ITeam, IRecordsWithTotal, IPaginationOptions, IQueryOptions } from '../../../definition/ITeam'; import { IRoom } from '../../../definition/IRoom'; import { ICreateRoomParams } from './IRoomService'; @@ -46,7 +46,7 @@ export interface ITeamService { removeRoom(uid: string, rid: string, teamId: string, canRemoveAnyRoom: boolean): Promise; listRooms(uid: string, teamId: string, getAllRooms: boolean, allowPrivateTeam: boolean, pagination: IPaginationOptions): Promise>; updateRoom(uid: string, rid: string, isDefault: boolean, canUpdateAnyRoom: boolean): Promise; - list(uid: string, options?: IPaginationOptions): Promise>; + list(uid: string, paginationOptions?: IPaginationOptions, queryOptions?: IQueryOptions): Promise>; listAll(options?: IPaginationOptions): Promise>; listByNames(names: Array, options?: FindOneOptions): Promise>; search(userId: string, term: string | RegExp, options?: FindOneOptions): Promise; diff --git a/server/services/team/service.ts b/server/services/team/service.ts index f7cdd282efda5..5bb285de5371f 100644 --- a/server/services/team/service.ts +++ b/server/services/team/service.ts @@ -1,7 +1,7 @@ import { Db, FindOneOptions } from 'mongodb'; import { TeamRaw } from '../../../app/models/server/raw/Team'; -import { ITeam, ITeamMember, TEAM_TYPE, IRecordsWithTotal, IPaginationOptions, ITeamStats } from '../../../definition/ITeam'; +import { ITeam, ITeamMember, TEAM_TYPE, IRecordsWithTotal, IPaginationOptions, IQueryOptions, ITeamStats } from '../../../definition/ITeam'; import { Room } from '../../sdk'; import { ITeamCreateParams, ITeamInfo, ITeamMemberInfo, ITeamMemberParams, ITeamService } from '../../sdk/types/ITeamService'; import { IUser } from '../../../definition/IUser'; @@ -175,7 +175,7 @@ export class TeamService extends ServiceClass implements ITeamService { return this.TeamModel.findByNameAndTeamIds(term, teamIds, options).toArray(); } - async list(uid: string, { offset, count }: IPaginationOptions = { offset: 0, count: 50 }): Promise> { + async list(uid: string, { offset, count }: IPaginationOptions = { offset: 0, count: 50 }, { sort, query }: IQueryOptions = { sort: {} }): Promise> { const userTeams = await this.TeamMembersModel.findByUserId(uid, { projection: { teamId: 1 } }).toArray(); const teamIds = userTeams.map(({ teamId }) => teamId); @@ -187,9 +187,10 @@ export class TeamService extends ServiceClass implements ITeamService { } const cursor = this.TeamModel.findByIds(teamIds, { + sort, limit: count, skip: offset, - }); + }, query); const records = await cursor.toArray(); const results: ITeamInfo[] = [];