Skip to content

Commit a95091a

Browse files
authored
Merge pull request #2 from Axel77g/feat/customer
feat(customer): implement Customer repository
2 parents 4ef9dc5 + f555457 commit a95091a

File tree

51 files changed

+650
-211
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+650
-211
lines changed

backend/knexfile.js

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

backend/migrations/20241222141816_create_dealers_table.js

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

backend/migrations/20241222141909_create_spare_parts_table.js

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

backend/migrations/20241222141910_create_order_table.js

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

backend/migrations/20241222142304_create_order_lines_table.js

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

backend/migrations/20241222142314_create_dealers_stock_transactions_table.js

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

backend/src/application/inventoryManagement/usecases/dealer/RegisterDealerUseCase.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
import { Dealer } from "@domain/inventoryManagement/entities/Dealer";
2-
import { DealerAddress } from "@domain/inventoryManagement/value-object/DealerAddress";
1+
import { RegisterDealerEvent } from "@domain/inventoryManagement/events/RegisterDealerEvent";
2+
import { Address } from "@domain/shared/value-object/Address";
33
import { Siret } from '@domain/shared/value-object/Siret';
44
import { IInputUseCase, IUseCase } from "@shared/IUseCase";
55
import { Result } from "@shared/Result";
6-
import { DealerRepository } from "../../repositories/DealerRepository";
7-
import {EventRepository} from "../../../shared/repositories/EventRepository";
8-
import {RegisterDealerEvent} from "@domain/inventoryManagement/events/RegisterDealerEvent";
6+
import { EventRepository } from "../../../shared/repositories/EventRepository";
97

108
interface RegisterDealerInput extends IInputUseCase {
119
siret: Siret,
1210
name: string,
13-
address: DealerAddress,
11+
address: Address,
1412
phoneNumber: string
1513
}
1614

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { AbstractProjection } from "@application/shared/projections/AbstractProjection";
2+
import { ProjectionJobScheduler } from "@application/shared/projections/ProjectionJobScheduler";
3+
import { Customer } from "@domain/maintenance/entities/Customer";
4+
import { RegisterCustomerEvent } from "@domain/maintenance/events/RegisterCustomerEvent";
5+
import { UnregisterCustomerEvent } from "@domain/maintenance/events/UnregisterCustomerEvent";
6+
import { UpdateCustomerEvent } from "@domain/maintenance/events/UpdateCustomerEvent";
7+
import { Result, VoidResult } from "@shared/Result";
8+
import { CustomerRepository } from "../repositories/CustomerRepository";
9+
10+
export class CustomerProjection extends AbstractProjection {
11+
constructor(private _customerRepository: CustomerRepository) {
12+
super();
13+
}
14+
15+
init(projectionJobScheduler: ProjectionJobScheduler) {
16+
projectionJobScheduler.schedule(RegisterCustomerEvent.type, this.constructor.name)
17+
projectionJobScheduler.schedule(UpdateCustomerEvent.type, this.constructor.name)
18+
projectionJobScheduler.schedule(UnregisterCustomerEvent.type, this.constructor.name)
19+
20+
}
21+
22+
bindEvents() {
23+
return {
24+
[RegisterCustomerEvent.type]: this.applyRegisterEvent,
25+
[UpdateCustomerEvent.type]: this.applyUpdateEvent,
26+
[UnregisterCustomerEvent.type]: this.applyUnregisteredEvent
27+
}
28+
}
29+
30+
async applyRegisterEvent(event: RegisterCustomerEvent): Promise<VoidResult> {
31+
const customer = Customer.fromObject(event.payload)
32+
if (customer instanceof Error) return Result.FailureStr("Cannot register customer");
33+
return this._customerRepository.store(customer)
34+
}
35+
36+
async applyUnregisteredEvent(event: UnregisterCustomerEvent): Promise<VoidResult> {
37+
const response = await this._customerRepository.find(event.payload.customerId)
38+
if (!response.success) return Result.FailureStr("Cannot delete customer")
39+
return this._customerRepository.delete(event.payload.customerId)
40+
}
41+
42+
async applyUpdateEvent(event: UpdateCustomerEvent): Promise<VoidResult> {
43+
const customer = await this._customerRepository.find(event.payload.customerId)
44+
if (!customer.success) return Result.FailureStr("Cannot update customer")
45+
46+
const updatedCustomer = Customer.fromObject({
47+
...customer,
48+
...event.payload
49+
})
50+
if (updatedCustomer instanceof Error) return Result.FailureStr("Cannot update customer")
51+
return this._customerRepository.store(updatedCustomer);
52+
}
53+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Customer } from "@domain/maintenance/entities/Customer";
2+
import { IRepository } from "@shared/IRepository";
3+
import { Result, VoidResult } from "@shared/Result";
4+
5+
export interface CustomerRepository extends IRepository {
6+
find(customerId: string): Promise<Result<Customer>>;
7+
store(customer: Customer): Promise<VoidResult>;
8+
delete(customerId: string): Promise<VoidResult>;
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Garage } from '../../../domain/maintenance/entities/Garage';
2+
import { Siret } from '../../../domain/shared/value-object/Siret';
3+
import { IRepository } from '../../../shared/IRepository';
4+
import { Result, VoidResult } from '../../../shared/Result';
5+
6+
export interface GarageRepository extends IRepository {
7+
getBySiret(siret: Siret): Promise<Result<Garage>>
8+
store(garage: Garage): Promise<VoidResult>;
9+
delete(siret: Siret): Promise<VoidResult>;
10+
}

0 commit comments

Comments
 (0)