teams.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
  2. import type {Client} from 'sentry/api';
  3. import {tct} from 'sentry/locale';
  4. import TeamStore from 'sentry/stores/teamStore';
  5. import type {Team} from 'sentry/types/organization';
  6. type CallbackOptions = {
  7. error?: Function;
  8. success?: Function;
  9. };
  10. const doCallback = (
  11. params: CallbackOptions = {},
  12. name: keyof CallbackOptions,
  13. ...args: any[]
  14. ) => params[name]?.(...args);
  15. /**
  16. * Note these are both slugs
  17. */
  18. type OrgSlug = {orgId: string};
  19. type OrgAndTeamSlug = OrgSlug & {teamId: string};
  20. /**
  21. * This is the actual internal id, not username or email
  22. */
  23. type MemberId = {memberId: string};
  24. // Fetch user teams for current org and place them in the team store
  25. export async function fetchUserTeams(api: Client, params: OrgSlug) {
  26. const teams = await api.requestPromise(`/organizations/${params.orgId}/user-teams/`);
  27. TeamStore.loadUserTeams(teams);
  28. }
  29. export function fetchTeamDetails(
  30. api: Client,
  31. params: OrgAndTeamSlug,
  32. options?: CallbackOptions
  33. ) {
  34. return api.request(`/teams/${params.orgId}/${params.teamId}/`, {
  35. success: data => {
  36. TeamStore.onUpdateSuccess(params.teamId, data);
  37. doCallback(options, 'success', data);
  38. },
  39. error: error => {
  40. doCallback(options, 'error', error);
  41. },
  42. });
  43. }
  44. export function updateTeamSuccess(teamId: OrgAndTeamSlug['teamId'], data: Team) {
  45. TeamStore.onUpdateSuccess(teamId, data);
  46. }
  47. /**
  48. * @deprecated use joinTeamPromise instead
  49. */
  50. export function joinTeam(
  51. api: Client,
  52. params: OrgAndTeamSlug & Partial<MemberId>,
  53. options: CallbackOptions
  54. ) {
  55. const endpoint = `/organizations/${params.orgId}/members/${
  56. params.memberId ?? 'me'
  57. }/teams/${params.teamId}/`;
  58. return api.request(endpoint, {
  59. method: 'POST',
  60. success: data => {
  61. TeamStore.onUpdateSuccess(params.teamId, data);
  62. doCallback(options, 'success', data);
  63. },
  64. error: error => {
  65. doCallback(options, 'error', error);
  66. },
  67. });
  68. }
  69. export async function joinTeamPromise(
  70. api: Client,
  71. params: OrgAndTeamSlug & Partial<MemberId>
  72. ) {
  73. const data: Team = await api.requestPromise(
  74. `/organizations/${params.orgId}/members/${params.memberId ?? 'me'}/teams/${params.teamId}/`,
  75. {
  76. method: 'POST',
  77. }
  78. );
  79. TeamStore.onUpdateSuccess(params.teamId, data);
  80. return data;
  81. }
  82. /**
  83. * @deprecated use leaveTeamPromise instead
  84. */
  85. export function leaveTeam(
  86. api: Client,
  87. params: OrgAndTeamSlug & Partial<MemberId>,
  88. options: CallbackOptions
  89. ) {
  90. const endpoint = `/organizations/${params.orgId}/members/${
  91. params.memberId || 'me'
  92. }/teams/${params.teamId}/`;
  93. return api.request(endpoint, {
  94. method: 'DELETE',
  95. success: data => {
  96. TeamStore.onUpdateSuccess(params.teamId, data);
  97. doCallback(options, 'success', data);
  98. },
  99. error: error => {
  100. doCallback(options, 'error', error);
  101. },
  102. });
  103. }
  104. export async function leaveTeamPromise(
  105. api: Client,
  106. params: OrgAndTeamSlug & Partial<MemberId>
  107. ) {
  108. const data: Team = await api.requestPromise(
  109. `/organizations/${params.orgId}/members/${params.memberId ?? 'me'}/teams/${params.teamId}/`,
  110. {
  111. method: 'DELETE',
  112. }
  113. );
  114. TeamStore.onUpdateSuccess(params.teamId, data);
  115. return data;
  116. }
  117. export function createTeam(api: Client, team: Pick<Team, 'slug'>, params: OrgSlug) {
  118. return api
  119. .requestPromise(`/organizations/${params.orgId}/teams/`, {
  120. method: 'POST',
  121. data: team,
  122. })
  123. .then(
  124. data => {
  125. TeamStore.onCreateSuccess(data);
  126. addSuccessMessage(
  127. tct('[team] has been added to the [organization] organization', {
  128. team: `#${data.slug}`,
  129. organization: params.orgId,
  130. })
  131. );
  132. return data;
  133. },
  134. err => {
  135. addErrorMessage(
  136. tct('Unable to create [team] in the [organization] organization', {
  137. team: `#${team.slug}`,
  138. organization: params.orgId,
  139. })
  140. );
  141. throw err;
  142. }
  143. );
  144. }
  145. export function removeTeam(api: Client, params: OrgAndTeamSlug) {
  146. return api
  147. .requestPromise(`/teams/${params.orgId}/${params.teamId}/`, {
  148. method: 'DELETE',
  149. })
  150. .then(
  151. data => {
  152. TeamStore.onRemoveSuccess(params.teamId);
  153. addSuccessMessage(
  154. tct('[team] has been removed from the [organization] organization', {
  155. team: `#${params.teamId}`,
  156. organization: params.orgId,
  157. })
  158. );
  159. return data;
  160. },
  161. err => {
  162. addErrorMessage(
  163. tct('Unable to remove [team] from the [organization] organization', {
  164. team: `#${params.teamId}`,
  165. organization: params.orgId,
  166. })
  167. );
  168. throw err;
  169. }
  170. );
  171. }