Skip to content

[#1001] fix(UI): Fix null requests in the web UI #1378

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions web/app/metalakes/MetalakeView.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,23 @@ const MetalakeView = props => {
case 'metalakes':
dispatch(fetchCatalogs({ init: true, page, metalake }))
dispatch(getMetalakeDetails({ metalake }))

break
case 'catalogs':
dispatch(fetchSchemas({ init: true, page, metalake, catalog }))
dispatch(getCatalogDetails({ metalake, catalog }))

if (catalog !== null) {
dispatch(fetchSchemas({ init: true, page, metalake, catalog }))
dispatch(getCatalogDetails({ metalake, catalog }))
}
break
case 'schemas':
dispatch(fetchTables({ init: true, page, metalake, catalog, schema }))
dispatch(getSchemaDetails({ metalake, catalog, schema }))

if (catalog !== null && schema !== null) {
dispatch(fetchTables({ init: true, page, metalake, catalog, schema }))
dispatch(getSchemaDetails({ metalake, catalog, schema }))
}
break
case 'tables':
dispatch(getTableDetails({ metalake, catalog, schema, table }))
if (catalog !== null && schema !== null && table !== null) {
dispatch(getTableDetails({ metalake, catalog, schema, table }))
}
break
default:
break
Expand Down
214 changes: 115 additions & 99 deletions web/lib/store/metalakes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'

import { to } from '@/lib/utils'

import {
createMetalakeApi,
getMetalakesApi,
Expand All @@ -18,53 +20,51 @@ import { getSchemasApi, getSchemaDetailsApi } from '@/lib/api/schemas'
import { getTablesApi, getTableDetailsApi } from '@/lib/api/tables'

export const fetchMetalakes = createAsyncThunk('appMetalakes/fetchMetalakes', async (params, { getState }) => {
try {
const response = await getMetalakesApi()

const { metalakes } = response
const [err, res] = await to(getMetalakesApi())

return {
metalakes
}
} catch (error) {
throw new Error(error)
if (err || !res) {
throw new Error(err)
}

const { metalakes } = res

return { metalakes }
})

export const createMetalake = createAsyncThunk('appMetalakes/createMetalake', async (data, { getState, dispatch }) => {
try {
const response = await createMetalakeApi(data)
const [err, res] = await to(createMetalakeApi(data))

dispatch(fetchMetalakes())

return response.metalake
} catch (error) {
throw new Error(error)
if (err || !res) {
throw new Error(err)
}

dispatch(fetchMetalakes())

return res.metalake
})

export const deleteMetalake = createAsyncThunk('appMetalakes/deleteMetalake', async (name, { dispatch }) => {
try {
const response = await deleteMetalakeApi(name)

dispatch(fetchMetalakes())
const [err, res] = await to(deleteMetalakeApi(name))

return response
} catch (error) {
throw new Error(error)
if (err || !res) {
throw new Error(err)
}

dispatch(fetchMetalakes())

return res
})

export const updateMetalake = createAsyncThunk('appMetalakes/updateMetalake', async ({ name, data }, { dispatch }) => {
try {
const response = await updateMetalakeApi({ name, data })
const [err, res] = await to(updateMetalakeApi({ name, data }))

dispatch(fetchMetalakes())

return response
} catch (error) {
throw new Error(error)
if (err || !res) {
throw new Error(err)
}

dispatch(fetchMetalakes())

return res
})

export const initMetalakeTree = createAsyncThunk(
Expand Down Expand Up @@ -197,97 +197,109 @@ export const setIntoTreeAction = createAsyncThunk(
)

export const getMetalakeDetails = createAsyncThunk('appMetalakes/getMetalakeDetails', async ({ metalake }) => {
const response = await getMetalakeDetailsApi(metalake)
const [err, res] = await to(getMetalakeDetailsApi(metalake))

const { metalake: resMetalake } = response
if (err || !res) {
throw new Error(err)
}

const { metalake: resMetalake } = res

return resMetalake
})

export const fetchCatalogs = createAsyncThunk(
'appMetalakes/fetchCatalogs',
async ({ init, page, metalake }, { dispatch }) => {
try {
const response = await getCatalogsApi({ metalake })
const [err, res] = await to(getCatalogsApi({ metalake }))

const { identifiers = [] } = response
if (err || !res) {
throw new Error(err)
}

const catalogs = identifiers.map(catalog => {
return {
...catalog,
node: 'catalog',
id: `${metalake}____${catalog.name}`,
path: `?${new URLSearchParams({ metalake, catalog: catalog.name }).toString()}`,
name: catalog.name,
schemas: []
}
})
const { identifiers = [] } = res

const catalogs = identifiers.map(catalog => {
return {
catalogs,
page,
init
...catalog,
node: 'catalog',
id: `${metalake}____${catalog.name}`,
path: `?${new URLSearchParams({ metalake, catalog: catalog.name }).toString()}`,
name: catalog.name,
schemas: []
}
} catch (error) {
throw new Error(error)
})

return {
catalogs,
page,
init
}
}
)

export const getCatalogDetails = createAsyncThunk('appMetalakes/getCatalogDetails', async ({ metalake, catalog }) => {
const response = await getCatalogDetailsApi({ metalake, catalog })
const [err, res] = await to(getCatalogDetailsApi({ metalake, catalog }))

if (err || !res) {
throw new Error(err)
}

const { catalog: resCatalog } = response
const { catalog: resCatalog } = res

return resCatalog
})

export const createCatalog = createAsyncThunk(
'appMetalakes/createCatalog',
async ({ data, metalake }, { dispatch }) => {
try {
const response = await createCatalogApi({ data, metalake })
const [err, res] = await to(createCatalogApi({ data, metalake }))

const { catalog: catalogItem } = response
if (err || !res) {
throw new Error(err)
}

dispatch(setIntoTreeAction({ catalogItem, nodeIds: [metalake] }))
const { catalog: catalogItem } = res

return response.catalog
} catch (error) {
throw new Error(error)
}
dispatch(setIntoTreeAction({ catalogItem, nodeIds: [metalake] }))

return res.catalog
}
)

export const fetchSchemas = createAsyncThunk('appMetalakes/fetchSchemas', async ({ init, page, metalake, catalog }) => {
try {
const response = await getSchemasApi({ metalake, catalog })
const [err, res] = await to(getSchemasApi({ metalake, catalog }))

if (err || !res) {
throw new Error(err)
}

const { identifiers = [] } = response
const { identifiers = [] } = res

const schemas = identifiers.map(schema => {
return {
...schema,
node: 'schema',
id: `${metalake}____${catalog}____${schema.name}`,
path: `?${new URLSearchParams({ metalake, catalog, schema: schema.name }).toString()}`,
name: schema.name,
tables: []
}
})
const schemas = identifiers.map(schema => {
return {
...schema,
node: 'schema',
id: `${metalake}____${catalog}____${schema.name}`,
path: `?${new URLSearchParams({ metalake, catalog, schema: schema.name }).toString()}`,
name: schema.name,
tables: []
}
})

return { schemas, page, init }
} catch (error) {
throw new Error(error)
}
return { schemas, page, init }
})

export const getSchemaDetails = createAsyncThunk(
'appMetalakes/getSchemaDetails',
async ({ metalake, catalog, schema }) => {
const response = await getSchemaDetailsApi({ metalake, catalog, schema })
const [err, res] = await to(getSchemaDetailsApi({ metalake, catalog, schema }))

const { schema: resSchema } = response
if (err || !res) {
throw new Error(err)
}

const { schema: resSchema } = res

return resSchema
}
Expand All @@ -296,35 +308,39 @@ export const getSchemaDetails = createAsyncThunk(
export const fetchTables = createAsyncThunk(
'appMetalakes/fetchTables',
async ({ init, page, metalake, catalog, schema }) => {
try {
const response = await getTablesApi({ metalake, catalog, schema })

const { identifiers = [] } = response

const tables = identifiers.map(table => {
return {
...table,
node: 'table',
id: `${metalake}____${catalog}____${schema}____${table.name}`,
path: `?${new URLSearchParams({ metalake, catalog, schema, table: table.name }).toString()}`,
name: table.name,
columns: []
}
})
const [err, res] = await to(getTablesApi({ metalake, catalog, schema }))

return { tables, page, init }
} catch (error) {
throw new Error(error)
if (err || !res) {
throw new Error(err)
}

const { identifiers = [] } = res

const tables = identifiers.map(table => {
return {
...table,
node: 'table',
id: `${metalake}____${catalog}____${schema}____${table.name}`,
path: `?${new URLSearchParams({ metalake, catalog, schema, table: table.name }).toString()}`,
name: table.name,
columns: []
}
})

return { tables, page, init }
}
)

export const getTableDetails = createAsyncThunk(
'appMetalakes/getTableDetails',
async ({ metalake, catalog, schema, table }, { dispatch }) => {
const response = await getTableDetailsApi({ metalake, catalog, schema, table })
const [err, res] = await to(getTableDetailsApi({ metalake, catalog, schema, table }))

if (err || !res) {
throw new Error(err)
}

const { table: resTable } = response
const { table: resTable } = res

return resTable
}
Expand Down