teams.tsx 5.3 KB

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