teams.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
  2. import {Client} from 'sentry/api';
  3. import {tct} from 'sentry/locale';
  4. import TeamStore from 'sentry/stores/teamStore';
  5. import {Team} from 'sentry/types';
  6. import {callIfFunction} from 'sentry/utils/callIfFunction';
  7. type CallbackOptions = {
  8. error?: Function;
  9. success?: Function;
  10. };
  11. const doCallback = (
  12. params: CallbackOptions = {},
  13. name: keyof CallbackOptions,
  14. ...args: any[]
  15. ) => {
  16. callIfFunction(params[name], ...args);
  17. };
  18. /**
  19. * Note these are both slugs
  20. */
  21. type OrgSlug = {orgId: string};
  22. type OrgAndTeamSlug = OrgSlug & {teamId: string};
  23. /**
  24. * This is the actual internal id, not username or email
  25. */
  26. type MemberId = {memberId: string};
  27. // Fetch user teams for current org and place them in the team store
  28. export async function fetchUserTeams(api: Client, params: OrgSlug) {
  29. const teams = await api.requestPromise(`/organizations/${params.orgId}/user-teams/`);
  30. TeamStore.loadUserTeams(teams);
  31. }
  32. export function fetchTeamDetails(
  33. api: Client,
  34. params: OrgAndTeamSlug,
  35. options?: CallbackOptions
  36. ) {
  37. return api.request(`/teams/${params.orgId}/${params.teamId}/`, {
  38. success: data => {
  39. TeamStore.onUpdateSuccess(params.teamId, data);
  40. doCallback(options, 'success', data);
  41. },
  42. error: error => {
  43. doCallback(options, 'error', error);
  44. },
  45. });
  46. }
  47. export function updateTeamSuccess(teamId: OrgAndTeamSlug['teamId'], data: Team) {
  48. TeamStore.onUpdateSuccess(teamId, data);
  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 function leaveTeam(
  70. api: Client,
  71. params: OrgAndTeamSlug & Partial<MemberId>,
  72. options: CallbackOptions
  73. ) {
  74. const endpoint = `/organizations/${params.orgId}/members/${
  75. params.memberId || 'me'
  76. }/teams/${params.teamId}/`;
  77. return api.request(endpoint, {
  78. method: 'DELETE',
  79. success: data => {
  80. TeamStore.onUpdateSuccess(params.teamId, data);
  81. doCallback(options, 'success', data);
  82. },
  83. error: error => {
  84. doCallback(options, 'error', error);
  85. },
  86. });
  87. }
  88. export function createTeam(api: Client, team: Pick<Team, 'slug'>, params: OrgSlug) {
  89. return api
  90. .requestPromise(`/organizations/${params.orgId}/teams/`, {
  91. method: 'POST',
  92. data: team,
  93. })
  94. .then(
  95. data => {
  96. TeamStore.onCreateSuccess(data);
  97. addSuccessMessage(
  98. tct('[team] has been added to the [organization] organization', {
  99. team: `#${data.slug}`,
  100. organization: params.orgId,
  101. })
  102. );
  103. return data;
  104. },
  105. err => {
  106. addErrorMessage(
  107. tct('Unable to create [team] in the [organization] organization', {
  108. team: `#${team.slug}`,
  109. organization: params.orgId,
  110. })
  111. );
  112. throw err;
  113. }
  114. );
  115. }
  116. export function removeTeam(api: Client, params: OrgAndTeamSlug) {
  117. return api
  118. .requestPromise(`/teams/${params.orgId}/${params.teamId}/`, {
  119. method: 'DELETE',
  120. })
  121. .then(
  122. data => {
  123. TeamStore.onRemoveSuccess(params.teamId);
  124. addSuccessMessage(
  125. tct('[team] has been removed from the [organization] organization', {
  126. team: `#${params.teamId}`,
  127. organization: params.orgId,
  128. })
  129. );
  130. return data;
  131. },
  132. err => {
  133. addErrorMessage(
  134. tct('Unable to remove [team] from the [organization] organization', {
  135. team: `#${params.teamId}`,
  136. organization: params.orgId,
  137. })
  138. );
  139. throw err;
  140. }
  141. );
  142. }