thunks.ts 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /**
  2. * Datart
  3. *
  4. * Copyright 2021
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. import { createAsyncThunk } from '@reduxjs/toolkit';
  19. import { ChartDataRequestBuilder } from 'app/models/ChartDataRequestBuilder';
  20. import { handleServerBoardAction } from 'app/pages/DashBoardPage/pages/Board/slice/asyncActions';
  21. import {
  22. ServerDashboard,
  23. VizRenderMode,
  24. } from 'app/pages/DashBoardPage/pages/Board/slice/types';
  25. import {
  26. ChartPreview,
  27. FilterSearchParams,
  28. } from 'app/pages/MainPage/pages/VizPage/slice/types';
  29. import { handleServerStoryAction } from 'app/pages/StoryBoardPage/slice/actions';
  30. import { ServerStoryBoard } from 'app/pages/StoryBoardPage/slice/types';
  31. import { IChartDrillOption } from 'app/types/ChartDrillOption';
  32. import { convertToChartDto } from 'app/utils/ChartDtoHelper';
  33. import { fetchAvailableSourceFunctionsAsyncForShare } from 'app/utils/fetch';
  34. import { RootState } from 'types';
  35. import persistence from 'utils/persistence';
  36. import { request2 } from 'utils/request';
  37. import { shareActions } from '.';
  38. import { ShareVizInfo } from './types';
  39. import { PermissionLevels } from '../../MainPage/pages/PermissionPage/constants';
  40. export const fetchShareVizInfo = createAsyncThunk(
  41. 'share/fetchShareVizInfo',
  42. async (
  43. {
  44. shareToken,
  45. sharePassword,
  46. filterSearchParams,
  47. renderMode,
  48. userName,
  49. passWord,
  50. authorizedToken,
  51. }: {
  52. shareToken?: string;
  53. sharePassword?: string;
  54. filterSearchParams?: FilterSearchParams;
  55. renderMode?: VizRenderMode;
  56. userName?: string;
  57. passWord?: string;
  58. authorizedToken?: string;
  59. },
  60. thunkAPI,
  61. ) => {
  62. const authenticationMode = filterSearchParams?.type?.join();
  63. const isMatchByName = !!filterSearchParams?.isMatchByName;
  64. let data = {} as ShareVizInfo;
  65. const response = await request2<ShareVizInfo>({
  66. url: `/shares/${shareToken}/viz`,
  67. method: 'POST',
  68. data: {
  69. authenticationMode,
  70. authenticationCode: sharePassword,
  71. id: shareToken,
  72. username: userName,
  73. password: passWord,
  74. authorizedToken,
  75. },
  76. });
  77. data = response.data;
  78. await thunkAPI.dispatch(shareActions.setVizType(data.vizType));
  79. if (authenticationMode === 'CODE') {
  80. persistence.session.save(shareToken, sharePassword);
  81. }
  82. await thunkAPI.dispatch(shareActions.saveNeedVerify(false));
  83. await thunkAPI.dispatch(
  84. shareActions.saveShareInfo({
  85. token: data.executeToken,
  86. pwd: sharePassword,
  87. }),
  88. );
  89. await thunkAPI.dispatch(
  90. shareActions.setExecuteTokenMap({
  91. executeToken: data.executeToken,
  92. }),
  93. );
  94. switch (data.vizType) {
  95. case 'DATACHART':
  96. const shareVizInfo = {
  97. ...data,
  98. vizDetail: convertToChartDto(data.vizDetail),
  99. };
  100. thunkAPI.dispatch(
  101. shareActions.setDataChart({
  102. data: shareVizInfo,
  103. filterSearchParams,
  104. isMatchByName,
  105. }),
  106. );
  107. break;
  108. case 'DASHBOARD':
  109. const serverBoard = data.vizDetail as ServerDashboard;
  110. // setExecuteTokenMap
  111. thunkAPI.dispatch(
  112. handleServerBoardAction({
  113. data: serverBoard,
  114. renderMode: renderMode || 'share',
  115. filterSearchMap: {
  116. params: filterSearchParams,
  117. isMatchByName: true,
  118. },
  119. executeToken: data.executeToken,
  120. }),
  121. );
  122. break;
  123. case 'STORYBOARD':
  124. thunkAPI.dispatch(
  125. shareActions.setSubVizTokenMap({
  126. subVizToken: data.subVizToken,
  127. }),
  128. );
  129. thunkAPI.dispatch(
  130. handleServerStoryAction({
  131. data: data.vizDetail as ServerStoryBoard,
  132. renderMode: 'read',
  133. storyId: data.vizDetail.id,
  134. }),
  135. );
  136. break;
  137. default:
  138. break;
  139. }
  140. return { data, filterSearchParams };
  141. },
  142. );
  143. export const fetchShareDataSetByPreviewChartAction = createAsyncThunk(
  144. 'share/fetchDataSetByPreviewChartAction',
  145. async (
  146. args: {
  147. preview: ChartPreview;
  148. pageInfo?: any;
  149. sorter?: { column: string; operator: string; aggOperator?: string };
  150. drillOption?: IChartDrillOption;
  151. filterSearchParams?: FilterSearchParams;
  152. },
  153. thunkAPI,
  154. ) => {
  155. const state = thunkAPI.getState() as RootState;
  156. const shareState = state.share;
  157. if (!args.preview?.backendChart?.view.id) {
  158. return;
  159. }
  160. const builder = new ChartDataRequestBuilder(
  161. {
  162. id: args.preview?.backendChart?.view.id || '',
  163. config: args.preview?.backendChart?.view.config || {},
  164. meta: args?.preview?.backendChart?.view?.meta,
  165. computedFields:
  166. args.preview?.backendChart?.config?.computedFields || [],
  167. type: args.preview?.backendChart?.view.type || 'SQL',
  168. },
  169. args.preview?.chartConfig?.datas,
  170. args.preview?.chartConfig?.settings,
  171. args.pageInfo,
  172. false,
  173. args.preview?.backendChart?.config?.aggregation,
  174. );
  175. const executeParam = builder
  176. .addExtraSorters(args?.sorter ? [args?.sorter as any] : [])
  177. .addDrillOption(args?.drillOption)
  178. .build();
  179. const response = await request2({
  180. method: 'POST',
  181. url: `shares/execute`,
  182. params: {
  183. executeToken:
  184. shareState?.shareToken[executeParam.viewId]['authorizedToken'],
  185. },
  186. data: executeParam,
  187. });
  188. return response.data;
  189. },
  190. );
  191. export const updateFilterAndFetchDatasetForShare = createAsyncThunk(
  192. 'share/updateFilterAndFetchDatasetForShare',
  193. async (
  194. arg: {
  195. backendChartId: string;
  196. chartPreview?: ChartPreview;
  197. payload;
  198. drillOption?: IChartDrillOption;
  199. },
  200. thunkAPI,
  201. ) => {
  202. await thunkAPI.dispatch(
  203. shareActions.updateChartPreviewFilter({
  204. backendChartId: arg.backendChartId,
  205. payload: arg.payload,
  206. }),
  207. );
  208. const state = thunkAPI.getState() as RootState;
  209. const shareState = state.share;
  210. await thunkAPI.dispatch(
  211. fetchShareDataSetByPreviewChartAction({
  212. preview: shareState?.chartPreview!,
  213. drillOption: arg.drillOption,
  214. }),
  215. );
  216. return {
  217. backendChartId: arg.backendChartId,
  218. };
  219. },
  220. );
  221. export const updateGroupAndFetchDatasetForShare = createAsyncThunk(
  222. 'share/updateGroupAndFetchDatasetForShare',
  223. async (
  224. arg: {
  225. backendChartId: string;
  226. chartPreview?: ChartPreview;
  227. payload;
  228. drillOption?: IChartDrillOption;
  229. },
  230. thunkAPI,
  231. ) => {
  232. await thunkAPI.dispatch(
  233. shareActions.updateChartPreviewGroup({
  234. backendChartId: arg.backendChartId,
  235. payload: arg.payload,
  236. }),
  237. );
  238. const state = thunkAPI.getState() as RootState;
  239. const shareState = state.share;
  240. await thunkAPI.dispatch(
  241. fetchShareDataSetByPreviewChartAction({
  242. preview: shareState?.chartPreview!,
  243. drillOption: arg.drillOption,
  244. }),
  245. );
  246. return {
  247. backendChartId: arg.backendChartId,
  248. };
  249. },
  250. );
  251. export const getOauth2Clients = createAsyncThunk<[]>(
  252. 'app/getOauth2Clients',
  253. async () => {
  254. const { data } = await request2<[]>({
  255. url: '/tpa/getOauth2Clients',
  256. method: 'GET',
  257. });
  258. return data;
  259. },
  260. );
  261. export const fetchAvailableSourceFunctionsForShare = createAsyncThunk<
  262. string[],
  263. { sourceId: string; executeToken: string }
  264. >(
  265. 'workbench/fetchAvailableSourceFunctionsAsyncForShare',
  266. async ({ sourceId, executeToken }) => {
  267. try {
  268. return await fetchAvailableSourceFunctionsAsyncForShare(
  269. sourceId,
  270. executeToken,
  271. );
  272. } catch (err) {
  273. throw err;
  274. }
  275. },
  276. );