website refactor

This commit is contained in:
2026-01-16 22:32:55 +01:00
parent 27f5a52e04
commit 9edf64130f
84 changed files with 497 additions and 300 deletions

View File

@@ -1,5 +1,5 @@
import { ListUsersUseCase } from '@core/admin/application/use-cases/ListUsersUseCase';
import type { IAdminUserRepository } from '@core/admin/domain/repositories/AdminUserRepository';
import type { AdminUserRepository } from '@core/admin/domain/repositories/AdminUserRepository';
import type { Provider } from '@nestjs/common';
import { Module } from '@nestjs/common';
import { InMemoryAdminPersistenceModule } from '../../persistence/inmemory/InMemoryAdminPersistenceModule';
@@ -18,14 +18,14 @@ const adminProviders: Provider[] = [
{
provide: ListUsersUseCase,
useFactory: (
repository: IAdminUserRepository,
repository: AdminUserRepository,
) => new ListUsersUseCase(repository),
inject: [ADMIN_USER_REPOSITORY_TOKEN],
},
{
provide: GetDashboardStatsUseCase,
useFactory: (
repository: IAdminUserRepository,
repository: AdminUserRepository,
) => new GetDashboardStatsUseCase(repository),
inject: [ADMIN_USER_REPOSITORY_TOKEN],
},

View File

@@ -1,4 +1,4 @@
import type { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort';
import type { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort/UseCaseOutputPort/UseCaseOutputPort_TEMP_TEMP';
import type { DashboardStatsResult } from '../use-cases/GetDashboardStatsUseCase';
export interface DashboardStatsResponse {

View File

@@ -1,6 +1,6 @@
import { ListUsersResult } from '@core/admin/application/use-cases/ListUsersUseCase';
import type { AdminUser } from '@core/admin/domain/entities/AdminUser';
import { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort';
import { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort/UseCaseOutputPort/UseCaseOutputPort_TEMP_TEMP';
import { UserListResponseDto, UserResponseDto } from '../dtos/UserResponseDto';
export type ListUsersViewModel = UserListResponseDto;

View File

@@ -1,8 +1,10 @@
import type { IAdminUserRepository } from '@core/admin/domain/repositories/AdminUserRepository';
import type { AdminUserRepository } from '@core/admin/domain/repositories/AdminUserRepository';
import { AuthorizationService } from '@core/admin/domain/services/AuthorizationService';
import { UserId } from '@core/admin/domain/value-objects/UserId';
import { Result } from '@core/shared/domain/Result';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
import type { AdminUser } from '@core/admin/domain/entities/AdminUser';
import type { UserRole } from '@core/admin/domain/value-objects/UserRole';
export interface DashboardStatsResult {
totalUsers: number;
@@ -44,7 +46,7 @@ export type GetDashboardStatsApplicationError = ApplicationErrorCode<GetDashboar
export class GetDashboardStatsUseCase {
constructor(
private readonly adminUserRepo: IAdminUserRepository,
private readonly adminUserRepo: AdminUserRepository,
) {}
async execute(input: GetDashboardStatsInput): Promise<Result<DashboardStatsResult, GetDashboardStatsApplicationError>> {
@@ -73,25 +75,25 @@ export class GetDashboardStatsUseCase {
// Calculate basic stats
const totalUsers = allUsers.length;
const activeUsers = allUsers.filter(u => u.status.value === 'active').length;
const suspendedUsers = allUsers.filter(u => u.status.value === 'suspended').length;
const deletedUsers = allUsers.filter(u => u.status.value === 'deleted').length;
const systemAdmins = allUsers.filter(u => u.isSystemAdmin()).length;
const activeUsers = allUsers.filter((u: AdminUser) => u.status.value === 'active').length;
const suspendedUsers = allUsers.filter((u: AdminUser) => u.status.value === 'suspended').length;
const deletedUsers = allUsers.filter((u: AdminUser) => u.status.value === 'deleted').length;
const systemAdmins = allUsers.filter((u: AdminUser) => u.isSystemAdmin()).length;
// Recent logins (last 24 hours)
const oneDayAgo = new Date();
oneDayAgo.setDate(oneDayAgo.getDate() - 1);
const recentLogins = allUsers.filter(u => u.lastLoginAt && u.lastLoginAt > oneDayAgo).length;
const recentLogins = allUsers.filter((u: AdminUser) => u.lastLoginAt && u.lastLoginAt > oneDayAgo).length;
// New users today
const today = new Date();
today.setHours(0, 0, 0, 0);
const newUsersToday = allUsers.filter(u => u.createdAt > today).length;
const newUsersToday = allUsers.filter((u: AdminUser) => u.createdAt > today).length;
// Role distribution
const roleCounts: Record<string, number> = {};
allUsers.forEach(user => {
user.roles.forEach(role => {
allUsers.forEach((user: AdminUser) => {
user.roles.forEach((role: UserRole) => {
const roleValue = role.value;
roleCounts[roleValue] = (roleCounts[roleValue] || 0) + 1;
});
@@ -110,7 +112,7 @@ export class GetDashboardStatsUseCase {
date.setDate(date.getDate() - i);
const dateStr = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
const count = allUsers.filter(u => {
const count = allUsers.filter((u: AdminUser) => {
const userDate = new Date(u.createdAt);
return userDate.toDateString() === date.toDateString();
}).length;
@@ -129,12 +131,12 @@ export class GetDashboardStatsUseCase {
date.setDate(date.getDate() - i);
const dateStr = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
const newUsers = allUsers.filter(u => {
const newUsers = allUsers.filter((u: AdminUser) => {
const userDate = new Date(u.createdAt);
return userDate.toDateString() === date.toDateString();
}).length;
const logins = allUsers.filter(u => {
const logins = allUsers.filter((u: AdminUser) => {
const loginDate = u.lastLoginAt;
return loginDate && loginDate.toDateString() === date.toDateString();
}).length;