Skip to content

Commit

Permalink
improve/remove transactions
Browse files Browse the repository at this point in the history
  • Loading branch information
vieiralucas committed Jan 13, 2025
1 parent b5b5384 commit ab0abb3
Show file tree
Hide file tree
Showing 11 changed files with 368 additions and 528 deletions.
32 changes: 31 additions & 1 deletion apps/api/src/document-tree.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as yjsDocsV2 from './yjs/v2/documents.js'
import * as dfns from 'date-fns'
import { PrismaTransaction, Document } from '@briefer/database'
import { prisma, PrismaTransaction, Document } from '@briefer/database'
import PQueue from 'p-queue'
import { IOServer } from './websocket/index.js'

Expand Down Expand Up @@ -261,6 +261,21 @@ async function softDeleteChildren(
}

export async function deleteDocument(
id: string,
workspaceId: string,
softDelete: boolean,
tx?: PrismaTransaction
): Promise<Document> {
if (tx) {
return deleteDocumentInTransaction(id, workspaceId, softDelete, tx)
}

return prisma().$transaction((tx) =>
deleteDocumentInTransaction(id, workspaceId, softDelete, tx)
)
}

async function deleteDocumentInTransaction(
id: string,
workspaceId: string,
softDelete: boolean,
Expand Down Expand Up @@ -323,6 +338,21 @@ function getDuplicatedTitle(prevTitle: string) {
}

export async function duplicateDocument(
id: string,
workspaceId: string,
socketServer: IOServer,
tx?: PrismaTransaction
): Promise<Document> {
if (tx) {
return duplicateDocumentInTransaction(id, workspaceId, socketServer, tx)
}

return prisma().$transaction((tx) =>
duplicateDocumentInTransaction(id, workspaceId, socketServer, tx)
)
}

export async function duplicateDocumentInTransaction(
id: string,
workspaceId: string,
socketServer: IOServer,
Expand Down
72 changes: 31 additions & 41 deletions apps/api/src/v1/workspaces/workspace/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,50 +47,40 @@ export default function componentsRouter(socketServer: IOServer) {
return
}

await prisma().$transaction(
async (tx) => {
const component = await createReusableComponent(payload.data, tx)
await getYDocForUpdate(
getDocId(payload.data.documentId, null),
socketServer,
payload.data.documentId,
workspaceId,
async (ydoc) => {
const block = ydoc.blocks.get(payload.data.blockId)
if (!block) {
throw new Error(
`Could not find block ${payload.data.blockId} in document ${payload.data.documentId}`
)
}

switchBlockType(block, {
onSQL: (block) =>
block.setAttribute('componentId', component.id),
onPython: (block) =>
block.setAttribute('componentId', component.id),
onRichText: () => {},
onVisualization: () => {},
onInput: () => {},
onDropdownInput: () => {},
onDateInput: () => {},
onFileUpload: () => {},
onDashboardHeader: () => {},
onWriteback: () => {},
onPivotTable: () => {},
})
},
new DocumentPersistor(payload.data.documentId),
tx
)
await broadcastComponent(socketServer, component)
const component = await createReusableComponent(payload.data)
await getYDocForUpdate(
getDocId(payload.data.documentId, null),
socketServer,
payload.data.documentId,
workspaceId,
async (ydoc) => {
const block = ydoc.blocks.get(payload.data.blockId)
if (!block) {
throw new Error(
`Could not find block ${payload.data.blockId} in document ${payload.data.documentId}`
)
}

res.json(component)
switchBlockType(block, {
onSQL: (block) => block.setAttribute('componentId', component.id),
onPython: (block) =>
block.setAttribute('componentId', component.id),
onRichText: () => {},
onVisualization: () => {},
onInput: () => {},
onDropdownInput: () => {},
onDateInput: () => {},
onFileUpload: () => {},
onDashboardHeader: () => {},
onWriteback: () => {},
onPivotTable: () => {},
})
},
{
maxWait: 31000,
timeout: 30000,
}
new DocumentPersistor(payload.data.documentId)
)
await broadcastComponent(socketServer, component)

res.json(component)
} catch (err) {
req.log.error({ workspaceId, err }, 'Error creating reusable component')
res.sendStatus(500)
Expand Down
123 changes: 59 additions & 64 deletions apps/api/src/v1/workspaces/workspace/data-sources/data-source.ts
Original file line number Diff line number Diff line change
Expand Up @@ -588,70 +588,65 @@ const dataSourceRouter = (socketServer: IOServer) => {
{ type: dataSource.type, id: dataSource.data.id, isDefault: true },
])

await prisma().$transaction(
(tx) =>
Promise.all(
actions.map((ds) => {
switch (ds.type) {
case 'psql':
return tx.postgreSQLDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'mysql':
return tx.mySQLDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'trino':
return tx.trinoDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'athena':
return tx.athenaDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'oracle':
return tx.oracleDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'bigquery':
return tx.bigQueryDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'redshift':
return tx.redshiftDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'sqlserver':
return tx.sQLServerDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'snowflake':
return tx.snowflakeDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'databrickssql':
return tx.databricksSQLDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
default:
exhaustiveCheck(ds.type)
}
})
),
{
maxWait: 31000,
timeout: 30000,
}
await prisma().$transaction((tx) =>
Promise.all(
actions.map((ds) => {
switch (ds.type) {
case 'psql':
return tx.postgreSQLDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'mysql':
return tx.mySQLDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'trino':
return tx.trinoDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'athena':
return tx.athenaDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'oracle':
return tx.oracleDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'bigquery':
return tx.bigQueryDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'redshift':
return tx.redshiftDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'sqlserver':
return tx.sQLServerDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'snowflake':
return tx.snowflakeDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
case 'databrickssql':
return tx.databricksSQLDataSource.update({
where: { id: ds.id },
data: { isDefault: ds.isDefault },
})
default:
exhaustiveCheck(ds.type)
}
})
)
)
await broadcastDataSources(socketServer, workspaceId)
res.sendStatus(204)
Expand Down
Loading

0 comments on commit ab0abb3

Please sign in to comment.