Evan Purkhiser 2 лет назад
Родитель
Сommit
338b58493a

+ 14 - 15
static/app/actionCreators/release.tsx

@@ -5,7 +5,6 @@ import {
   addLoadingMessage,
   addSuccessMessage,
 } from 'sentry/actionCreators/indicator';
-import ReleaseActions from 'sentry/actions/releaseActions';
 import {Client} from 'sentry/api';
 import {t} from 'sentry/locale';
 import ReleaseStore, {getReleaseStoreKey} from 'sentry/stores/releaseStore';
@@ -28,23 +27,23 @@ export function getProjectRelease(api: Client, params: ParamsGet) {
   // This hack short-circuits that and update the state immediately.
   ReleaseStore.state.releaseLoading[getReleaseStoreKey(projectSlug, releaseVersion)] =
     true;
-  ReleaseActions.loadRelease(orgSlug, projectSlug, releaseVersion);
+  ReleaseStore.loadRelease(orgSlug, projectSlug, releaseVersion);
 
   return api
     .requestPromise(path, {
       method: 'GET',
     })
     .then((res: Release) => {
-      ReleaseActions.loadReleaseSuccess(projectSlug, releaseVersion, res);
+      ReleaseStore.loadReleaseSuccess(projectSlug, releaseVersion, res);
     })
     .catch(err => {
       // This happens when a Project is not linked to a specific Release
       if (err.status === 404) {
-        ReleaseActions.loadReleaseSuccess(projectSlug, releaseVersion, null);
+        ReleaseStore.loadReleaseSuccess(projectSlug, releaseVersion, null);
         return;
       }
 
-      ReleaseActions.loadReleaseError(projectSlug, releaseVersion, err);
+      ReleaseStore.loadReleaseError(projectSlug, releaseVersion, err);
       Sentry.withScope(scope => {
         scope.setLevel('warning');
         scope.setFingerprint(['getRelease-action-creator']);
@@ -62,23 +61,23 @@ export function getReleaseDeploys(api: Client, params: ParamsGet) {
   // HACK(leedongwei): Same as above
   ReleaseStore.state.deploysLoading[getReleaseStoreKey(projectSlug, releaseVersion)] =
     true;
-  ReleaseActions.loadDeploys(orgSlug, projectSlug, releaseVersion);
+  ReleaseStore.loadDeploys(orgSlug, projectSlug, releaseVersion);
 
   return api
     .requestPromise(path, {
       method: 'GET',
     })
     .then((res: Deploy[]) => {
-      ReleaseActions.loadDeploysSuccess(projectSlug, releaseVersion, res);
+      ReleaseStore.loadDeploysSuccess(projectSlug, releaseVersion, res);
     })
     .catch(err => {
       // This happens when a Project is not linked to a specific Release
       if (err.status === 404) {
-        ReleaseActions.loadDeploysSuccess(projectSlug, releaseVersion, null);
+        ReleaseStore.loadDeploysSuccess(projectSlug, releaseVersion, null);
         return;
       }
 
-      ReleaseActions.loadDeploysError(projectSlug, releaseVersion, err);
+      ReleaseStore.loadDeploysError(projectSlug, releaseVersion, err);
       Sentry.withScope(scope => {
         scope.setLevel('warning');
         scope.setFingerprint(['getReleaseDeploys-action-creator']);
@@ -90,7 +89,7 @@ export function getReleaseDeploys(api: Client, params: ParamsGet) {
 export function archiveRelease(api: Client, params: ParamsGet) {
   const {orgSlug, projectSlug, releaseVersion} = params;
 
-  ReleaseActions.loadRelease(orgSlug, projectSlug, releaseVersion);
+  ReleaseStore.loadRelease(orgSlug, projectSlug, releaseVersion);
   addLoadingMessage(t('Archiving Release\u2026'));
 
   return api
@@ -103,11 +102,11 @@ export function archiveRelease(api: Client, params: ParamsGet) {
       },
     })
     .then((release: Release) => {
-      ReleaseActions.loadReleaseSuccess(projectSlug, releaseVersion, release);
+      ReleaseStore.loadReleaseSuccess(projectSlug, releaseVersion, release);
       addSuccessMessage(t('Release was successfully archived.'));
     })
     .catch(error => {
-      ReleaseActions.loadReleaseError(projectSlug, releaseVersion, error);
+      ReleaseStore.loadReleaseError(projectSlug, releaseVersion, error);
       addErrorMessage(
         error.responseJSON?.detail ?? t('Release could not be be archived.')
       );
@@ -118,7 +117,7 @@ export function archiveRelease(api: Client, params: ParamsGet) {
 export function restoreRelease(api: Client, params: ParamsGet) {
   const {orgSlug, projectSlug, releaseVersion} = params;
 
-  ReleaseActions.loadRelease(orgSlug, projectSlug, releaseVersion);
+  ReleaseStore.loadRelease(orgSlug, projectSlug, releaseVersion);
   addLoadingMessage(t('Restoring Release\u2026'));
 
   return api
@@ -131,11 +130,11 @@ export function restoreRelease(api: Client, params: ParamsGet) {
       },
     })
     .then((release: Release) => {
-      ReleaseActions.loadReleaseSuccess(projectSlug, releaseVersion, release);
+      ReleaseStore.loadReleaseSuccess(projectSlug, releaseVersion, release);
       addSuccessMessage(t('Release was successfully restored.'));
     })
     .catch(error => {
-      ReleaseActions.loadReleaseError(projectSlug, releaseVersion, error);
+      ReleaseStore.loadReleaseError(projectSlug, releaseVersion, error);
       addErrorMessage(
         error.responseJSON?.detail ?? t('Release could not be be restored.')
       );

+ 0 - 12
static/app/actions/releaseActions.tsx

@@ -1,12 +0,0 @@
-import {createActions} from 'reflux';
-
-const ReleaseActions = createActions([
-  'loadRelease', // Singular as it loads 1 release
-  'loadReleaseError',
-  'loadReleaseSuccess',
-  'loadDeploys', // Plural as it loads all deploys related to a release
-  'loadDeploysError',
-  'loadDeploysSuccess',
-]);
-
-export default ReleaseActions;

+ 18 - 12
static/app/stores/releaseStore.tsx

@@ -1,7 +1,6 @@
 import {createStore, StoreDefinition} from 'reflux';
 
 import OrganizationActions from 'sentry/actions/organizationActions';
-import ReleaseActions from 'sentry/actions/releaseActions';
 import {Deploy, Organization, Release} from 'sentry/types';
 import {makeSafeRefluxStore} from 'sentry/utils/makeSafeRefluxStore';
 
@@ -26,10 +25,18 @@ interface ReleaseStoreDefinition extends StoreDefinition {
   loadDeploys(orgSlug: string, projectSlug: string, releaseVersion: string): void;
 
   loadDeploysError(projectSlug: string, releaseVersion: string, error: Error): void;
-  loadDeploysSuccess(projectSlug: string, releaseVersion: string, data: Release): void;
+  loadDeploysSuccess(
+    projectSlug: string,
+    releaseVersion: string,
+    data: Deploy[] | null
+  ): void;
   loadRelease(orgSlug: string, projectSlug: string, releaseVersion: string): void;
   loadReleaseError(projectSlug: string, releaseVersion: string, error: Error): void;
-  loadReleaseSuccess(projectSlug: string, releaseVersion: string, data: Release): void;
+  loadReleaseSuccess(
+    projectSlug: string,
+    releaseVersion: string,
+    data: Release | null
+  ): void;
   state: {
     deploys: StoreDeploys;
     deploysError: StoreError;
@@ -56,7 +63,6 @@ const storeConfig: ReleaseStoreDefinition = {
     deploysError: new Map() as StoreError,
   },
 
-  listenables: ReleaseActions,
   unsubscribeListeners: [],
 
   init() {
@@ -79,13 +85,13 @@ const storeConfig: ReleaseStoreDefinition = {
     this.trigger(this.state);
   },
 
-  updateOrganization(org: Organization) {
+  updateOrganization(org) {
     this.reset();
     this.state.orgSlug = org.slug;
     this.trigger(this.state);
   },
 
-  loadRelease(orgSlug: string, projectSlug: string, releaseVersion: string) {
+  loadRelease(orgSlug, projectSlug, releaseVersion) {
     // Wipe entire store if the user switched organizations
     if (!this.orgSlug || this.orgSlug !== orgSlug) {
       this.reset();
@@ -109,7 +115,7 @@ const storeConfig: ReleaseStoreDefinition = {
     this.trigger(this.state);
   },
 
-  loadReleaseError(projectSlug: string, releaseVersion: string, error: Error) {
+  loadReleaseError(projectSlug, releaseVersion, error) {
     const releaseKey = getReleaseStoreKey(projectSlug, releaseVersion);
     const {releaseLoading, releaseError, ...state} = this.state;
 
@@ -127,7 +133,7 @@ const storeConfig: ReleaseStoreDefinition = {
     this.trigger(this.state);
   },
 
-  loadReleaseSuccess(projectSlug: string, releaseVersion: string, data: Release) {
+  loadReleaseSuccess(projectSlug, releaseVersion, data) {
     const releaseKey = getReleaseStoreKey(projectSlug, releaseVersion);
     const {release, releaseLoading, releaseError, ...state} = this.state;
     this.state = {
@@ -148,7 +154,7 @@ const storeConfig: ReleaseStoreDefinition = {
     this.trigger(this.state);
   },
 
-  loadDeploys(orgSlug: string, projectSlug: string, releaseVersion: string) {
+  loadDeploys(orgSlug, projectSlug, releaseVersion) {
     // Wipe entire store if the user switched organizations
     if (!this.orgSlug || this.orgSlug !== orgSlug) {
       this.reset();
@@ -172,7 +178,7 @@ const storeConfig: ReleaseStoreDefinition = {
     this.trigger(this.state);
   },
 
-  loadDeploysError(projectSlug: string, releaseVersion: string, error: Error) {
+  loadDeploysError(projectSlug, releaseVersion, error) {
     const releaseKey = getReleaseStoreKey(projectSlug, releaseVersion);
     const {deploysLoading, deploysError, ...state} = this.state;
 
@@ -190,7 +196,7 @@ const storeConfig: ReleaseStoreDefinition = {
     this.trigger(this.state);
   },
 
-  loadDeploysSuccess(projectSlug: string, releaseVersion: string, data: Release) {
+  loadDeploysSuccess(projectSlug, releaseVersion, data) {
     const releaseKey = getReleaseStoreKey(projectSlug, releaseVersion);
     const {deploys, deploysLoading, deploysError, ...state} = this.state;
 
@@ -212,7 +218,7 @@ const storeConfig: ReleaseStoreDefinition = {
     this.trigger(this.state);
   },
 
-  get(projectSlug: string, releaseVersion: string) {
+  get(projectSlug, releaseVersion) {
     const releaseKey = getReleaseStoreKey(projectSlug, releaseVersion);
 
     return {

+ 12 - 13
tests/js/spec/actionCreators/release.spec.jsx

@@ -1,5 +1,4 @@
 import {getProjectRelease, getReleaseDeploys} from 'sentry/actionCreators/release';
-import ReleaseActions from 'sentry/actions/releaseActions';
 import ReleaseStore, {getReleaseStoreKey} from 'sentry/stores/releaseStore';
 
 describe('ReleaseActionCreator', function () {
@@ -27,8 +26,8 @@ describe('ReleaseActionCreator', function () {
       ReleaseStore.reset();
 
       jest.restoreAllMocks();
-      jest.spyOn(ReleaseActions, 'loadRelease');
-      jest.spyOn(ReleaseActions, 'loadReleaseSuccess');
+      jest.spyOn(ReleaseStore, 'loadRelease');
+      jest.spyOn(ReleaseStore, 'loadReleaseSuccess');
 
       // XXX(leedongwei): We cannot spy on ReleaseStore at all
       // See repositories.spec.jsx beforeEach method for the reason
@@ -36,18 +35,18 @@ describe('ReleaseActionCreator', function () {
 
     it('fetches a Release and emits actions', async () => {
       getProjectRelease(api, {orgSlug, projectSlug, releaseVersion});
-      expect(ReleaseActions.loadRelease).toHaveBeenCalledWith(
+      expect(ReleaseStore.loadRelease).toHaveBeenCalledWith(
         orgSlug,
         projectSlug,
         releaseVersion
       );
-      expect(ReleaseActions.loadReleaseSuccess).not.toHaveBeenCalled();
+      expect(ReleaseStore.loadReleaseSuccess).not.toHaveBeenCalled();
 
       await tick(); // Run Store.loadRelease and fire Action.loadReleaseSuccess
       await tick(); // Run Store.loadReleaseSuccess
 
       expect(mockResponse).toHaveBeenCalledWith(releaseUrl, expect.anything());
-      expect(ReleaseActions.loadReleaseSuccess).toHaveBeenCalledWith(
+      expect(ReleaseStore.loadReleaseSuccess).toHaveBeenCalledWith(
         projectSlug,
         releaseVersion,
         mockData
@@ -62,7 +61,7 @@ describe('ReleaseActionCreator', function () {
       expect(ReleaseStore.state.releaseLoading[releaseKey]).toEqual(undefined);
 
       getProjectRelease(api, {orgSlug, projectSlug, releaseVersion});
-      expect(ReleaseActions.loadRelease).toHaveBeenCalled();
+      expect(ReleaseStore.loadRelease).toHaveBeenCalled();
       // expect(ReleaseStore.loadRelease).not.toHaveBeenCalled(); // See above for comment on ReleaseStore
       expect(ReleaseStore.state.releaseLoading[releaseKey]).toEqual(true);
     });
@@ -83,24 +82,24 @@ describe('ReleaseActionCreator', function () {
       ReleaseStore.reset();
 
       jest.restoreAllMocks();
-      jest.spyOn(ReleaseActions, 'loadDeploys');
-      jest.spyOn(ReleaseActions, 'loadDeploysSuccess');
+      jest.spyOn(ReleaseStore, 'loadDeploys');
+      jest.spyOn(ReleaseStore, 'loadDeploysSuccess');
     });
 
     it('fetch Deploys and emit an action', async () => {
       getReleaseDeploys(api, {orgSlug, projectSlug, releaseVersion});
-      expect(ReleaseActions.loadDeploys).toHaveBeenCalledWith(
+      expect(ReleaseStore.loadDeploys).toHaveBeenCalledWith(
         orgSlug,
         projectSlug,
         releaseVersion
       );
-      expect(ReleaseActions.loadDeploysSuccess).not.toHaveBeenCalled();
+      expect(ReleaseStore.loadDeploysSuccess).not.toHaveBeenCalled();
 
       await tick(); // Run Store.loadDeploys and fire Action.loadDeploysSuccess
       await tick(); // Run Store.loadDeploysSuccess
 
       expect(mockResponse).toHaveBeenCalledWith(deploysUrl, expect.anything());
-      expect(ReleaseActions.loadDeploysSuccess).toHaveBeenCalledWith(
+      expect(ReleaseStore.loadDeploysSuccess).toHaveBeenCalledWith(
         projectSlug,
         releaseVersion,
         [mockData]
@@ -115,7 +114,7 @@ describe('ReleaseActionCreator', function () {
       expect(ReleaseStore.state.deploysLoading[releaseKey]).toEqual(undefined);
 
       getReleaseDeploys(api, {orgSlug, projectSlug, releaseVersion});
-      expect(ReleaseActions.loadDeploys).toHaveBeenCalled();
+      expect(ReleaseStore.loadDeploys).toHaveBeenCalled();
       // expect(ReleaseStore.loadDeploys).not.toHaveBeenCalled(); // See above for comment on ReleaseStore
       expect(ReleaseStore.state.deploysLoading[releaseKey]).toEqual(true);
     });