user => clean archi

This commit is contained in:
styve Lioumba
2025-11-17 13:06:50 +01:00
parent 8ab67e724c
commit 778cb95724
36 changed files with 330 additions and 148 deletions

View 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 });
}
}

View File

@@ -0,0 +1,9 @@
export interface UserViewModel {
id: string;
username: string;
verified: boolean;
emailVisibility: boolean;
email: string;
name: string;
avatar: string;
}

View 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);
}
}