Skip to content

Commit 9256be6

Browse files
committed
added comment, do not set rls if admin context
1 parent e9f2c2e commit 9256be6

File tree

3 files changed

+14
-18
lines changed

3 files changed

+14
-18
lines changed

packages/platform/db-postgres/src/client.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,6 @@ export const closePostgres = async (pool: Pool): Promise<void> => {
5353
await pool.end()
5454
}
5555

56-
/**
57-
* Check if a database operator is a transaction database.
58-
*
59-
* @param db The database operator to check
60-
* @returns True if the database is a transaction database, false otherwise
61-
*/
62-
export const isTransactionDb = (db: Operator): boolean => transactionDbs.has(db as object)
63-
64-
const transactionDbs = new WeakSet<object>()
65-
6656
const parsePostgresPoolConfig = (config: PostgresConfig = {}) =>
6757
Effect.all({
6858
connectionString: config.databaseUrl ? Effect.succeed(config.databaseUrl) : parseEnv("LAT_DATABASE_URL", "string"),
@@ -77,11 +67,7 @@ const parsePostgresPoolConfig = (config: PostgresConfig = {}) =>
7767

7868
const buildPostgresClient = (pool: Pool): PostgresClient => {
7969
const db = drizzle({ client: pool })
80-
const transaction = <T>(fn: (tx: TransactionDb) => Promise<T>): Promise<T> =>
81-
db.transaction(async (tx) => {
82-
transactionDbs.add(tx)
83-
return fn(tx)
84-
})
70+
const transaction = <T>(fn: (tx: TransactionDb) => Promise<T>): Promise<T> => db.transaction(async (tx) => fn(tx))
8571

8672
return { db, pool, transaction }
8773
}

packages/platform/db-postgres/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ export {
33
closePostgres,
44
createPostgresClient,
55
createPostgresPool,
6-
isTransactionDb,
76
} from "./client.ts"
87

98
export { InvalidEnvValueError, MissingEnvValueError } from "@platform/env"

packages/platform/db-postgres/src/sql-client.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,18 @@ import type { Operator, PostgresClient } from "./client.ts"
1515
* The inner effect runs in the parent fiber (via `Effect.exit`) so all
1616
* provided services (repositories, etc.) remain available inside the
1717
* transaction scope.
18+
*
19+
* **Concurrent transactions**: do NOT run two `transaction()` calls
20+
* concurrently on the same SqlClient instance (e.g. via `Effect.all` with
21+
* concurrency > 1). `activeTx` has no fiber identity, so concurrent
22+
* transactions will overwrite each other's operator and corrupt both
23+
* connections. Use separate `SqlClientLive` layer instances instead.
1824
*/
25+
const setRlsContext = (tx: Operator, organizationId: OrganizationId) => {
26+
if (organizationId === "system") return Promise.resolve()
27+
return tx.execute(sql`select set_config('app.current_organization_id', ${organizationId}, true)`)
28+
}
29+
1930
export const SqlClientLive = (client: PostgresClient, organizationId: OrganizationId = OrganizationId("system")) =>
2031
Layer.effect(
2132
SqlClient,
@@ -42,7 +53,7 @@ export const SqlClientLive = (client: PostgresClient, organizationId: Organizati
4253
})
4354

4455
const txPromise = client.transaction(async (tx) => {
45-
await tx.execute(sql`select set_config('app.current_organization_id', ${organizationId}, true)`)
56+
await setRlsContext(tx as Operator, organizationId)
4657
resolveTxReady(tx as Operator)
4758
const result = await effectDone
4859
if (!result.ok) throw result.error
@@ -89,7 +100,7 @@ export const SqlClientLive = (client: PostgresClient, organizationId: Organizati
89100
return yield* Effect.tryPromise({
90101
try: () =>
91102
client.transaction(async (tx) => {
92-
await tx.execute(sql`select set_config('app.current_organization_id', ${organizationId}, true)`)
103+
await setRlsContext(tx as Operator, organizationId)
93104
return fn(tx as Operator, organizationId)
94105
}),
95106
catch: (error) => toRepositoryError(error, "query"),

0 commit comments

Comments
 (0)