Skip to content

Commit

Permalink
fix: Update child's mpath even if parentId was soft-deleted in TreeRe…
Browse files Browse the repository at this point in the history
…pository

Include soft-deleted entities in queryBuilder to fetch required parent's path
even if parent is soft deleted. This path is required to perforn the corresponding
update of the childs' mpath

fix typeorm#10843
  • Loading branch information
JoseCToscano committed Apr 23, 2024
1 parent e7649d2 commit fdbe3fc
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/persistence/tree/MaterializedPathSubjectExecutor.ts
Expand Up @@ -172,6 +172,7 @@ export class MaterializedPathSubjectExecutor {
}
}),
)
.withDeleted()
.getRawOne()
.then((result) => (result ? result["path"] : ""))
}
Expand Down
36 changes: 36 additions & 0 deletions test/github-issues/10843/entity/node.ts
@@ -0,0 +1,36 @@
import {
TreeChildren,
TreeParent,
Entity,
PrimaryGeneratedColumn,
DeleteDateColumn,
Column,
Tree,
JoinColumn,
} from "../../../../src"

@Entity("node")
@Tree("materialized-path")
export class Node {
@PrimaryGeneratedColumn({ type: "int" })
id?: number

@DeleteDateColumn()
deletedAt?: Date

@Column("varchar")
name!: string

@TreeChildren({ cascade: true })
children?: Node[]

@Column({ type: "int", nullable: true, name: "parentId" })
parentId?: number

@TreeParent()
@JoinColumn({
name: "parentId",
referencedColumnName: "id",
})
parent?: Node
}
58 changes: 58 additions & 0 deletions test/github-issues/10843/issue-10843.ts
@@ -0,0 +1,58 @@
import "reflect-metadata"
import {
createTestingConnections,
closeTestingConnections,
reloadTestingDatabases,
} from "../../utils/test-utils"
import { DataSource } from "../../../src"
import {Node} from "./entity/node";
import {expect} from "chai";

describe("github issues > #10843 TreeRepository does not update mpath if parentId was soft-deleted", () => {
let dataSources: DataSource[]
before(
async () =>
(dataSources = await createTestingConnections({
entities: [__dirname + "/entity/*{.js,.ts}"],
schemaCreate: true,
dropSchema: true,
relationLoadStrategy: "query",
enabledDrivers: ["mysql"],
})),
)
beforeEach(() => reloadTestingDatabases(dataSources))
after(() => closeTestingConnections(dataSources))

it("Should update mpath even if parent was soft deleted", () =>
Promise.all(
dataSources.map(async (dataSource) => {
const nodeRepository = dataSource.getTreeRepository(Node)

// Entity instances setup
const parent = await nodeRepository.save(
nodeRepository.create({ name: "root node" }),
);
const child = await nodeRepository.save(
nodeRepository.create({ name: "child node", parent }),
);

// Validate mpath
let [mpath] = await dataSource.query("SELECT mpath FROM node WHERE id = ?", [child.id]);
expect(mpath?.mpath).to.be.equal(`${parent.id}.${child.id}.`)
// Soft delete parent
await nodeRepository.softDelete(parent);

// Assign new parent
const newParent = await nodeRepository.save(
nodeRepository.create({ name: "root node 2" }),
);
child.parent = newParent;
await nodeRepository.save(child);

[mpath] = await dataSource.query("SELECT mpath FROM node WHERE id = ?", [child.id]);

expect(mpath?.mpath).to.be.equal(`${newParent.id}.${child.id}.`)

}),
))
})

0 comments on commit fdbe3fc

Please sign in to comment.