{"record":{"id":"dc5aff45c0cd4c41","repo":"RocketChat/Rocket.Chat","slug":"team-name-already-exists","errorCode":null,"errorMessage":"team-name-already-exists","messagePattern":"team-name-already-exists","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"apps/meteor/server/services/team/service.ts","lineNumber":44,"sourceCode":"import { Team, Rooms, Subscriptions, Users, TeamMember } from '@rocket.chat/models';\nimport { escapeRegExp } from '@rocket.chat/tools';\nimport type { Document, FindOptions, Filter } from 'mongodb';\n\nimport { notifyOnSubscriptionChangedByRoomIdAndUserId, notifyOnRoomChangedById } from '../../lib/notifyListener';\nimport { addUserToRoom } from '../../lib/rooms/addUserToRoom';\nimport { getSubscribedRoomsForUserWithDetails } from '../../lib/rooms/getRoomsWithSingleOwner';\nimport { removeUserFromRoom } from '../../lib/rooms/removeUserFromRoom';\nimport { saveRoomName } from '../../lib/rooms/settings';\nimport { saveRoomType } from '../../lib/rooms/settings/saveRoomType';\nimport { checkUsernameAvailability } from '../../lib/users/checkUsernameAvailability';\nimport { settings } from '../../settings';\n\nexport class TeamService extends ServiceClassInternal implements ITeamService {\n\tprotected name = 'team';\n\n\tasync create(uid: string, { team, room = { name: team.name, extraData: {} }, members, owner }: ITeamCreateParams): Promise<ITeam> {\n\t\tif (!(await checkUsernameAvailability(team.name, 'room'))) {\n\t\t\tthrow new Error('team-name-already-exists');\n\t\t}\n\n\t\tconst existingRoom = await Rooms.findOneByName(team.name, { projection: { _id: 1 } });\n\t\tif (existingRoom && existingRoom._id !== room.id) {\n\t\t\tthrow new Error('room-name-already-exists');\n\t\t}\n\n\t\tconst createdBy = await Users.findOneById<Pick<IUser, 'username' | '_id'>>(uid, {\n\t\t\tprojection: { username: 1 },\n\t\t});\n\t\tif (!createdBy) {\n\t\t\tthrow new Error('invalid-user');\n\t\t}\n\n\t\t// TODO add validations to `data` and `members`\n\n\t\tconst membersResult =\n\t\t\t!members || !Array.isArray(members) || members.length === 0","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/RocketChat/Rocket.Chat/blob/b2c16d5842cbe6b69b59bdf6fc5e5f1afcd1f0b0/apps/meteor/server/services/team/service.ts#L26-L62","documentation":"TeamService.create() validates the team name with checkUsernameAvailability(team.name, 'room'), which returns false when the name is already taken (case-insensitively) by any user's username, any existing team, or — via the availability callback for type 'room' — a room. A false result is reported as team-name-already-exists. (Blocked/invalid names like 'all' or 'here' throw error-blocked-username earlier in that helper.)","triggerScenarios":"Creating a team whose name equals an existing user's username, an existing team's name, or an existing room's name, in any casing — teams share the username namespace.","commonSituations":"Name collisions with users; retries after partial failures where the name got taken in between; reserved/blacklisted names handled separately.","solutions":["Choose a different team name","Pre-check with checkUsernameAvailability(name, 'room') before submitting the create form","If the collision is with a leftover room/team from a failed create, remove it and retry"],"exampleFix":"// before\nawait teamService.create(uid, { team: { name: 'support' }, /* ... */ });\n\n// after\nif (!(await checkUsernameAvailability('support', 'room'))) {\n  throw new Error('team-name-already-exists'); // surface in the form before calling the service\n}\nawait teamService.create(uid, { team: { name: 'support' }, /* ... */ });","handlingStrategy":"validation","validationCode":"import { checkUsernameAvailability } from '/app/lib/users/checkUsernameAvailability';\n\nif (!(await checkUsernameAvailability(team.name, 'room'))) {\n  // name is taken by a user, team, or room (case-insensitive): pick another before create()\n  return markNameUnavailable(team.name);\n}","typeGuard":"const isTeamNameAvailable = async (name: string): Promise<boolean> =>\n  checkUsernameAvailability(name, 'room');","tryCatchPattern":"try {\n  await teamService.create(uid, params);\n} catch (err) {\n  if (err instanceof Error && err.message === 'team-name-already-exists') {\n    // surface inline in the form; auto-suggest an available variant instead of retrying\n    return suggestNameVariants(params.team.name);\n  }\n  throw err;\n}","preventionTips":["Teams share the username namespace: check names against users, teams, and rooms before submitting","Debounce an availability check on the create-team form","Clean up partially created teams/rooms after failed creates so names do not stay taken"],"tags":["teams","naming","duplicate-name","rocket-chat"],"backgroundTag":"duplicate-resource-name","analyzedSha":"b2c16d5842cbe6b69b59bdf6fc5e5f1afcd1f0b0","analyzedAt":"2026-08-18T15:26:39.429Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}