user => clean archi
This commit is contained in:
63
src/app/ui/users/user.facade.ts
Normal file
63
src/app/ui/users/user.facade.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import { inject, Injectable, signal } from '@angular/core';
|
||||
import { USER_REPOSITORY_TOKEN } from '@app/infrastructure/users/user-repository.token';
|
||||
import { GetUserUseCase } from '@app/usecase/users/get-user.usecase';
|
||||
import { UpdateUserUseCase } from '@app/usecase/users/update-user.usecase';
|
||||
import { LoaderAction } from '@app/domain/loader-action.util';
|
||||
import { ActionType } from '@app/domain/action-type.util';
|
||||
import { ErrorResponse } from '@app/domain/error-response.util';
|
||||
import { UserViewModel } from '@app/ui/users/user.presenter.model';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class UserFacade {
|
||||
private readonly userRepository = inject(USER_REPOSITORY_TOKEN);
|
||||
|
||||
private readonly getUseCase = new GetUserUseCase(this.userRepository);
|
||||
private readonly updateUseCase = new UpdateUserUseCase(this.userRepository);
|
||||
|
||||
readonly user = signal<UserViewModel>({} as UserViewModel);
|
||||
readonly users = signal<UserViewModel[]>([]);
|
||||
readonly loading = signal<LoaderAction>({ isLoading: false, action: ActionType.NONE });
|
||||
readonly error = signal<ErrorResponse>({
|
||||
action: ActionType.NONE,
|
||||
hasError: false,
|
||||
message: null,
|
||||
});
|
||||
|
||||
loadOne(userId: string) {
|
||||
this.handleError(ActionType.READ, false, null, true);
|
||||
this.getUseCase.execute(userId).subscribe({
|
||||
next: (user) => {
|
||||
this.user.set(user);
|
||||
this.handleError(ActionType.READ, false, null, false);
|
||||
},
|
||||
error: (err) => {
|
||||
this.handleError(ActionType.READ, false, err, false);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
update(userId: string, user: Partial<UserViewModel>) {
|
||||
this.handleError(ActionType.UPDATE, false, null, true);
|
||||
this.updateUseCase.execute(userId, user).subscribe({
|
||||
next: (user) => {
|
||||
this.user.set(user);
|
||||
this.handleError(ActionType.UPDATE, false, null, false);
|
||||
},
|
||||
error: (err) => {
|
||||
this.handleError(ActionType.UPDATE, false, err, false);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
private handleError(
|
||||
action: ActionType = ActionType.NONE,
|
||||
hasError: boolean,
|
||||
message: string | null = null,
|
||||
isLoading = false
|
||||
) {
|
||||
this.error.set({ action, hasError, message });
|
||||
this.loading.set({ action, isLoading });
|
||||
}
|
||||
}
|
||||
9
src/app/ui/users/user.presenter.model.ts
Normal file
9
src/app/ui/users/user.presenter.model.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
export interface UserViewModel {
|
||||
id: string;
|
||||
username: string;
|
||||
verified: boolean;
|
||||
emailVisibility: boolean;
|
||||
email: string;
|
||||
name: string;
|
||||
avatar: string;
|
||||
}
|
||||
22
src/app/ui/users/user.presenter.ts
Normal file
22
src/app/ui/users/user.presenter.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { UserViewModel } from '@app/ui/users/user.presenter.model';
|
||||
import { User } from '@app/domain/users/user.model';
|
||||
|
||||
export class UserPresenter {
|
||||
constructor() {}
|
||||
|
||||
toViewModel(user: User): UserViewModel {
|
||||
return {
|
||||
id: user.id,
|
||||
username: user.username,
|
||||
verified: user.verified,
|
||||
emailVisibility: user.emailVisibility,
|
||||
email: user.email,
|
||||
name: user.name,
|
||||
avatar: user.avatar,
|
||||
};
|
||||
}
|
||||
|
||||
toViewModels(users: User[]): UserViewModel[] {
|
||||
return users.map(this.toViewModel);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user