Skip to content

Commit 5e6f9dc

Browse files
committed
refactor(core)!: use facades in items use-cases
1 parent c347843 commit 5e6f9dc

24 files changed

+260
-317
lines changed

packages/core/app.spec.ts

Lines changed: 0 additions & 37 deletions
This file was deleted.

packages/core/app.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import ShowItem from './use-cases/show-item/show-item'
2323
import CreateItem from './use-cases/create-item/create-item'
2424
import UpdateItem from './use-cases/update-item/update-item'
2525
import DeleteItem from './use-cases/delete-item/delete-item'
26-
import AppService, { AppServiceArgs } from './services/app-service'
2726
import ListScripts from './use-cases/list-scripts/list-scripts'
2827
import CreateScript from './use-cases/create-script/create-script'
2928
import UpdateScript from './use-cases/update-script/update-script'
@@ -34,12 +33,13 @@ import UpdateMenu from './use-cases/update-menu/update-menu'
3433
import UpdateDirectoryEntry from './use-cases/update-directory-entry/update-directory-entry'
3534
import ShowViews from './use-cases/show-views/show-views'
3635
import UpdateViews from './use-cases/update-views/update-views'
36+
import AppConfig from './config/app'
3737

38-
function createUseCases(app: AppService) {
38+
function createUseCases(app: AppConfig) {
3939
return {
40-
'list-workspaces': new ListWorkspaces(app.repositories.workspace),
41-
'create-workspace': new CreateWorkspace(app.repositories.workspace, app.managers.drive),
42-
'delete-workspace': new DeleteWorkspace(app.repositories.workspace),
40+
'list-workspaces': new ListWorkspaces(app),
41+
'create-workspace': new CreateWorkspace(app),
42+
'delete-workspace': new DeleteWorkspace(app),
4343

4444
'show-workspace-options': new ShowWorkspaceOptions(app),
4545
'update-workspace-options': new UpdateWorkspaceOptions(app),
@@ -78,12 +78,10 @@ function createUseCases(app: AppService) {
7878
}
7979
}
8080

81-
export default class App extends AppService {
81+
export default class App {
8282
public cases: ReturnType<typeof createUseCases>
8383

84-
constructor(props: AppServiceArgs) {
85-
super(props)
86-
87-
this.cases = createUseCases(this)
84+
constructor(props: AppConfig) {
85+
this.cases = createUseCases(props)
8886
}
8987
}

packages/core/config/app.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import CollectionFacade from '../facades/collection'
22
import DriveFacade from '../facades/drive'
3+
import ItemFacade from '../facades/item'
4+
import ItemFacade from '../facades/item'
35
import Drive from '../gateways/drive/drive'
46
import IWorkspaceRepository from '../repositories/workspace/workspace-repository'
57

@@ -10,6 +12,7 @@ interface Repositories {
1012
interface Facades {
1113
drive: DriveFacade
1214
collection: CollectionFacade
15+
item: ItemFacade
1316
}
1417

1518
export default class AppConfig {
@@ -23,10 +26,12 @@ export default class AppConfig {
2326

2427
const driveFacade = new DriveFacade(drives)
2528
const collectionFacade = new CollectionFacade(driveFacade)
29+
const itemFacade = new ItemFacade(collectionFacade)
2630

2731
this.facades = {
2832
drive: driveFacade,
2933
collection: collectionFacade,
34+
item: itemFacade,
3035
}
3136
}
3237
}

packages/core/entities/directory-entry.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,28 @@ export default class DirectoryEntry {
6161
type: 'file',
6262
})
6363
}
64+
65+
public static encode(payload: any): Uint8Array {
66+
const encoder = new TextEncoder()
67+
68+
if (Array.isArray(payload) || typeof payload === 'object') {
69+
payload = JSON.stringify(payload, null, 4)
70+
}
71+
72+
if (typeof payload === 'number') {
73+
payload = String(payload)
74+
}
75+
76+
if (typeof payload === 'string') {
77+
payload = encoder.encode(payload)
78+
}
79+
80+
return payload as Uint8Array
81+
}
82+
83+
public static decode(payload: Uint8Array) {
84+
const decoder = new TextDecoder()
85+
86+
return decoder.decode(payload)
87+
}
6488
}

packages/core/facades/item.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Workspace from '../entities/workspace'
2+
import EntryItemRepository from '../repositories/item/implementations/entry-item-repository'
3+
import CollectionFacade from './collection'
4+
5+
export default class ItemFacade {
6+
constructor(public readonly collectionFacade: CollectionFacade) {}
7+
8+
public async createRepositoryFromWorkspace(workspace: Workspace, collectionId: string) {
9+
const repository = this.collectionFacade.createRepository(workspace)
10+
11+
const collection = await repository.show(collectionId)
12+
13+
return new EntryItemRepository(collection, repository.drive)
14+
}
15+
}

packages/core/repositories/item/implementations/entry-item-repository.spec.ts

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,26 @@ import EntryItemRepository from './entry-item-repository'
1010
import ItemNotFound from '../../../exceptions/item-not-found'
1111

1212
test.group('entry-item-repository (repository)', (group) => {
13-
const memory = new InMemoryDrive()
14-
15-
const manager = new DriveManager({ memory }, 'memory')
16-
17-
const repository = new EntryItemRepository(manager)
13+
const drive = new InMemoryDrive()
1814

1915
const collection = CollectionFactory.create()
2016

17+
const repository = new EntryItemRepository(collection, drive)
18+
2119
function saveMetas(metas: any[]) {
22-
memory.createFile(DirectoryEntry.normalize(collection.path, '.is', 'metas.json'), metas)
20+
drive.createFile(DirectoryEntry.normalize(collection.path, '.is', 'metas.json'), metas)
2321
}
2422

2523
function getMetas() {
26-
return memory.readArray(DirectoryEntry.normalize(collection.path, '.is', 'metas.json'))
24+
return drive.readArray(DirectoryEntry.normalize(collection.path, '.is', 'metas.json'))
2725
}
2826

29-
group.each.teardown(() => memory.clear())
27+
group.each.teardown(() => drive.clear())
3028

3129
test('should list entries as items', async ({ expect }) => {
3230
const items = Array.from({ length: 20 })
3331
.map((_, i) => String(i))
34-
.map((i) => memory.createDir(collection.path, i))
32+
.map((i) => drive.createDir(collection.path, i))
3533
.map(({ name }) => {
3634
const data = {
3735
gender: faker.name.gender(),
@@ -43,15 +41,15 @@ test.group('entry-item-repository (repository)', (group) => {
4341

4442
saveMetas(items)
4543

46-
const result = await repository.list(collection)
44+
const result = await repository.list()
4745

4846
expect(result).toEqual(items)
4947
})
5048

5149
test('should show method return a item by id', async ({ expect }) => {
52-
const entry = memory.createDir(collection.path, 'hello-word')
50+
const entry = drive.createDir(collection.path, 'hello-word')
5351

54-
const result = await repository.show(collection, entry.name)
52+
const result = await repository.show(entry.name)
5553

5654
expect(result).toEqual(new Item({}, entry.name))
5755
})
@@ -60,46 +58,45 @@ test.group('entry-item-repository (repository)', (group) => {
6058
expect.assertions(1)
6159

6260
await repository
63-
.show(collection, 'invalid')
61+
.show('invalid')
6462
.catch((err) => expect(err).toEqual(new ItemNotFound(collection.path, 'invalid')))
6563
})
6664

6765
test('should create a item', async ({ expect }) => {
6866
const item = new Item({ age: faker.random.numeric() }, 'hello')
6967

70-
await repository.create(collection, item)
68+
await repository.create(item)
7169

72-
const [result] = await repository.list(collection)
70+
const [result] = await repository.list()
7371

7472
expect(result.id).toEqual(item.id)
7573
expect(result.age).toEqual(item.age)
7674

77-
expect(manager.exists(collection.path, 'hello'))
75+
const folderExists = await drive.exists(DirectoryEntry.normalize(collection.path, 'hello'))
76+
77+
expect(folderExists).toBe(true)
7878
})
7979

8080
test('should update method throw an error if item not exists', async ({ expect }) => {
8181
expect.assertions(1)
8282

8383
await repository
84-
.update(collection, 'invalid', {
84+
.update('invalid', {
8585
hello: 'word',
8686
})
8787
.catch((err) => expect(err).toEqual(new ItemNotFound(collection.path, 'invalid')))
8888
})
8989

9090
test('should update a item', async ({ expect }) => {
91-
const item = await repository.create(
92-
collection,
93-
new Item({ age: faker.random.numeric() }, 'hello')
94-
)
91+
const item = await repository.create(new Item({ age: faker.random.numeric() }, 'hello'))
9592

9693
saveMetas([item])
9794

98-
await repository.update(collection, item.id, {
95+
await repository.update(item.id, {
9996
hello: 'word',
10097
})
10198

102-
const [result] = await repository.list(collection)
99+
const [result] = await repository.list()
103100

104101
expect(result.id).toBe(item.id)
105102
expect(result.age).toBe(item.age)
@@ -109,20 +106,19 @@ test.group('entry-item-repository (repository)', (group) => {
109106
})
110107

111108
test('should update method move item folder when id is defined', async ({ expect }) => {
112-
const item = await repository.create(
113-
collection,
114-
new Item({ age: faker.random.numeric() }, 'hello')
115-
)
109+
const item = await repository.create(new Item({ age: faker.random.numeric() }, 'hello'))
116110

117111
saveMetas([item])
118112

119-
await repository.update(collection, item.id, {
113+
await repository.update(item.id, {
120114
id: 'new-dir',
121115
})
122116

123-
const newItem = await repository.show(collection, 'new-dir')
117+
const newItem = await repository.show('new-dir')
124118

125-
const folderExists = await manager.exists(collection.path, 'new-dir')
119+
const folderExists = await drive.exists(
120+
DirectoryEntry.normalize(collection.path, 'new-dir')
121+
)
126122

127123
expect(folderExists).toBe(true)
128124
expect(newItem.age).toBe(item.age)
@@ -132,21 +128,18 @@ test.group('entry-item-repository (repository)', (group) => {
132128
expect.assertions(1)
133129

134130
await repository
135-
.destroy(collection, 'invalid')
131+
.destroy('invalid')
136132
.catch((err) => expect(err).toEqual(new ItemNotFound(collection.path, 'invalid')))
137133
})
138134

139135
test('should delete an item', async ({ expect }) => {
140-
const item = await repository.create(
141-
collection,
142-
new Item({ age: faker.random.numeric() }, 'hello')
143-
)
136+
const item = await repository.create(new Item({ age: faker.random.numeric() }, 'hello'))
144137

145138
saveMetas([item])
146139

147-
await repository.destroy(collection, item.id)
140+
await repository.destroy(item.id)
148141

149-
const items = await repository.list(collection)
142+
const items = await repository.list()
150143
const metas = await getMetas()
151144

152145
expect(items.length).toBe(0)

0 commit comments

Comments
 (0)