Skip to content

Commit b6dabcd

Browse files
chore: conform to clean architecture (#42)
* chore: conform * chore: conform
1 parent 1fadc26 commit b6dabcd

File tree

3 files changed

+63
-45
lines changed

3 files changed

+63
-45
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
1-
import { IsFeatureEnabledResponse } from '@common/entities/is-feature-enabled/is-feature-enabled.entity';
1+
import { IsFeatureEnabledErrorCode } from '@common/entities/is-feature-enabled/is-feature-enabled.entity';
22

33
export abstract class IsFeatureEnabledDataSource {
4-
abstract execute(feature: string): Promise<IsFeatureEnabledResponse>;
4+
abstract execute(feature: string): Promise<IsFeatureEnabledModelResponse>;
5+
}
6+
7+
export type IsFeatureEnabledModelResponse =
8+
| {
9+
ok: true;
10+
data: IsFeatureEnabledModelData;
11+
}
12+
| { ok: false; errorCode: IsFeatureEnabledErrorCode };
13+
14+
export interface IsFeatureEnabledModelData {
15+
development?: boolean;
16+
staging?: boolean;
17+
production?: boolean;
518
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,44 @@
1-
import { Injectable } from '@angular/core';
1+
import { Inject, Injectable } from '@angular/core';
22
import { IsFeatureEnabledDataSource } from '@common/application-business-rules/data-sources/is-feature-enabled/is-feature-enabled.data-source';
3-
import { IsFeatureEnabledResponse } from '@common/entities/is-feature-enabled/is-feature-enabled.entity';
3+
import {
4+
IsFeatureEnabledData,
5+
IsFeatureEnabledResponse,
6+
} from '@common/entities/is-feature-enabled/is-feature-enabled.entity';
7+
import {
8+
ENVIRONMENT_TOKEN,
9+
Environment,
10+
EnvironmentType,
11+
} from 'projects/common/src/environments/environment.entity';
412

513
@Injectable()
614
export class IsFeatureEnabledUseCase {
7-
constructor(private dataSource: IsFeatureEnabledDataSource) {}
15+
private environmentType: EnvironmentType = 'development';
816

9-
execute(feature: string): Promise<IsFeatureEnabledResponse> {
10-
return this.dataSource.execute(feature);
17+
constructor(
18+
private dataSource: IsFeatureEnabledDataSource,
19+
@Inject(ENVIRONMENT_TOKEN) environment: Environment,
20+
) {
21+
this.environmentType = environment.type;
22+
}
23+
24+
async execute(feature: string): Promise<IsFeatureEnabledResponse> {
25+
const response = await this.dataSource.execute(feature);
26+
27+
if (!response.ok) {
28+
return response;
29+
}
30+
31+
const data: IsFeatureEnabledData = (() => {
32+
switch (this.environmentType) {
33+
case 'development':
34+
return { isEnabled: response.data.development ?? false };
35+
case 'staging':
36+
return { isEnabled: response.data.staging ?? false };
37+
case 'production':
38+
return { isEnabled: response.data.production ?? false };
39+
}
40+
})();
41+
42+
return { ok: true, data: data };
1143
}
1244
}

projects/common/src/app/interface-adapters/data-sources/is-feature-enabled-mock/is-feature-enabled.mock.ts

Lines changed: 11 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,17 @@
11
import { Inject, Injectable } from '@angular/core';
22
import { Mutex } from '@common/frameworks-and-drivers/mutex/mutex';
33
import {
4-
IsFeatureEnabledData,
5-
IsFeatureEnabledResponse,
6-
} from '@common/entities/is-feature-enabled/is-feature-enabled.entity';
7-
import {
8-
ENVIRONMENT_TOKEN,
9-
Environment,
10-
EnvironmentType,
11-
} from 'projects/common/src/environments/environment.entity';
12-
import { IsFeatureEnabledDataSource } from '@common/application-business-rules/data-sources/is-feature-enabled/is-feature-enabled.data-source';
4+
IsFeatureEnabledDataSource,
5+
IsFeatureEnabledModelResponse,
6+
} from '@common/application-business-rules/data-sources/is-feature-enabled/is-feature-enabled.data-source';
137

148
@Injectable()
159
export class IsFeatureEnabledMock implements IsFeatureEnabledDataSource {
1610
private localCache?: Map<string, IsFeatureEnabledMockModel>;
1711

18-
constructor(
19-
@Inject(Mutex) private mutex: Mutex,
20-
@Inject(ENVIRONMENT_TOKEN) private environment: Environment,
21-
) {}
12+
constructor(@Inject(Mutex) private mutex: Mutex) {}
2213

23-
async execute(feature: string): Promise<IsFeatureEnabledResponse> {
14+
async execute(feature: string): Promise<IsFeatureEnabledModelResponse> {
2415
return this.mutex.runExclusive(async () => {
2516
// fetch
2617
if (!this.localCache) {
@@ -42,8 +33,7 @@ export class IsFeatureEnabledMock implements IsFeatureEnabledDataSource {
4233
};
4334
}
4435

45-
const element = response.get(feature)!;
46-
const data = isFeatureEnabledHelper(this.environment.type, element);
36+
const data = response.get(feature)!;
4737

4838
return {
4939
ok: true,
@@ -60,33 +50,16 @@ export class IsFeatureEnabledMock implements IsFeatureEnabledDataSource {
6050
};
6151
}
6252

63-
const element = this.localCache.get(feature)!;
64-
65-
const data = isFeatureEnabledHelper(this.environment.type, element);
53+
const data = this.localCache.get(feature)!;
6654

67-
return { ok: true, data: data };
55+
return {
56+
ok: true,
57+
data: data,
58+
};
6859
});
6960
}
7061
}
7162

72-
function isFeatureEnabledHelper(
73-
type: EnvironmentType,
74-
input: IsFeatureEnabledMockModel,
75-
) {
76-
const output: IsFeatureEnabledData = (() => {
77-
switch (type) {
78-
case 'development':
79-
return { isEnabled: input.development ?? false };
80-
case 'staging':
81-
return { isEnabled: input.staging ?? false };
82-
case 'production':
83-
return { isEnabled: input.production ?? false };
84-
}
85-
})();
86-
87-
return output;
88-
}
89-
9063
const databaseMock: Map<string, IsFeatureEnabledMockModel> = new Map([
9164
[
9265
'/lifecycle/steps/signup/name',

0 commit comments

Comments
 (0)