feat: refactor service organization and update imports
- Introduced a new structure for services in `src/services/` to improve organization by domain, including core, analytics, data management, integrations, and task management. - Moved relevant files to their new locations and updated all internal and external imports accordingly. - Updated `TODO.md` to reflect the new service organization and outlined phases for further refactoring.
This commit is contained in:
65
TODO.md
65
TODO.md
@@ -86,6 +86,71 @@
|
|||||||
- [ ] Configuration unifiée des filtres et synchronisations
|
- [ ] Configuration unifiée des filtres et synchronisations
|
||||||
- [ ] Dashboard multi-intégrations
|
- [ ] Dashboard multi-intégrations
|
||||||
|
|
||||||
|
## 🔄 Refactoring Services par Domaine
|
||||||
|
|
||||||
|
### Organisation cible des services:
|
||||||
|
```
|
||||||
|
src/services/
|
||||||
|
├── core/ # Services fondamentaux
|
||||||
|
├── analytics/ # Analytics et métriques
|
||||||
|
├── data-management/# Backup, système, base
|
||||||
|
├── integrations/ # Services externes
|
||||||
|
├── task-management/# Gestion des tâches
|
||||||
|
```
|
||||||
|
|
||||||
|
### Phase 1: Services Core (infrastructure) ✅
|
||||||
|
- [x] **Déplacer `database.ts`** → `core/database.ts`
|
||||||
|
- [x] Corriger tous les imports internes des services
|
||||||
|
- [x] Corriger import dans scripts/reset-database.ts
|
||||||
|
- [x] **Déplacer `system-info.ts`** → `core/system-info.ts`
|
||||||
|
- [x] Corriger imports dans actions/system
|
||||||
|
- [x] Corriger import dynamique de backup
|
||||||
|
- [x] **Déplacer `user-preferences.ts`** → `core/user-preferences.ts`
|
||||||
|
- [x] Corriger 13 imports externes (actions, API routes, pages)
|
||||||
|
- [x] Corriger 3 imports internes entre services
|
||||||
|
|
||||||
|
### Phase 2: Analytics & Métriques
|
||||||
|
- [ ] **Déplacer `analytics.ts`** → `analytics/analytics.ts`
|
||||||
|
- [ ] Corriger imports dans hooks/components analytics
|
||||||
|
- [ ] **Déplacer `metrics.ts`** → `analytics/metrics.ts`
|
||||||
|
- [ ] Corriger import dans `actions/metrics.ts`
|
||||||
|
- [ ] **Déplacer `manager-summary.ts`** → `analytics/manager-summary.ts`
|
||||||
|
- [ ] Corriger imports dans components dashboard
|
||||||
|
|
||||||
|
### Phase 3: Data Management
|
||||||
|
- [ ] **Déplacer `backup.ts`** → `data-management/backup.ts`
|
||||||
|
- [ ] Corriger imports dans backup-scheduler et actions
|
||||||
|
- [ ] **Déplacer `backup-scheduler.ts`** → `data-management/backup-scheduler.ts`
|
||||||
|
- [ ] Corriger imports dans API routes
|
||||||
|
|
||||||
|
### Phase 4: Task Management
|
||||||
|
- [ ] **Déplacer `tasks.ts`** → `task-management/tasks.ts`
|
||||||
|
- [ ] Corriger imports dans actions/tasks, hooks/useTasks
|
||||||
|
- [ ] **Déplacer `tags.ts`** → `task-management/tags.ts`
|
||||||
|
- [ ] Corriger import dans `actions/tags.ts`
|
||||||
|
- [ ] **Déplacer `daily.ts`** → `task-management/daily.ts`
|
||||||
|
- [ ] Corriger imports dans hooks/useDaily, actions/daily
|
||||||
|
|
||||||
|
### Phase 5: Intégrations (déjà partiellement fait)
|
||||||
|
- [ ] **Déplacer `tfs.ts`** → `integrations/tfs.ts`
|
||||||
|
- [ ] Corriger imports dans actions/tfs, API routes TFS, components TFS
|
||||||
|
- [ ] **Déplacer services Jira** → `integrations/jira/`
|
||||||
|
- [ ] `jira.ts` → `integrations/jira/jira.ts`
|
||||||
|
- [ ] `jira-scheduler.ts` → `integrations/jira/scheduler.ts`
|
||||||
|
- [ ] `jira-analytics.ts` → `integrations/jira/analytics.ts`
|
||||||
|
- [ ] `jira-analytics-cache.ts` → `integrations/jira/analytics-cache.ts`
|
||||||
|
- [ ] `jira-advanced-filters.ts` → `integrations/jira/advanced-filters.ts`
|
||||||
|
- [ ] `jira-anomaly-detection.ts` → `integrations/jira/anomaly-detection.ts`
|
||||||
|
- [ ] Corriger tous les imports Jira dans actions, API routes, hooks
|
||||||
|
|
||||||
|
### Points d'attention pour chaque service:
|
||||||
|
1. **Identifier tous les imports du service** (grep)
|
||||||
|
2. **Déplacer le fichier** vers le nouveau dossier
|
||||||
|
3. **Corriger les imports externes** (actions, API, hooks, components)
|
||||||
|
4. **Corriger les imports internes** entre services
|
||||||
|
5. **Tester** que l'app fonctionne toujours
|
||||||
|
6. **Commit** le déplacement d'un service à la fois
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 👥 Gestion multi-utilisateurs (PROJET MAJEUR)
|
### 👥 Gestion multi-utilisateurs (PROJET MAJEUR)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { prisma } from '../src/services/database';
|
import { prisma } from '../src/services/core/database';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Script pour reset la base de données et supprimer les anciennes données
|
* Script pour reset la base de données et supprimer les anciennes données
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use server';
|
'use server';
|
||||||
|
|
||||||
import { JiraAnalyticsService } from '@/services/jira-analytics';
|
import { JiraAnalyticsService } from '@/services/jira-analytics';
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { JiraAnalytics } from '@/lib/types';
|
import { JiraAnalytics } from '@/lib/types';
|
||||||
|
|
||||||
export type JiraAnalyticsResult = {
|
export type JiraAnalyticsResult = {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { jiraAnomalyDetection, JiraAnomaly, AnomalyDetectionConfig } from '@/services/jira-anomaly-detection';
|
import { jiraAnomalyDetection, JiraAnomaly, AnomalyDetectionConfig } from '@/services/jira-anomaly-detection';
|
||||||
import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics';
|
import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics';
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
|
|
||||||
export interface AnomalyDetectionResult {
|
export interface AnomalyDetectionResult {
|
||||||
success: boolean;
|
success: boolean;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics';
|
import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics';
|
||||||
import { JiraAdvancedFiltersService } from '@/services/jira-advanced-filters';
|
import { JiraAdvancedFiltersService } from '@/services/jira-advanced-filters';
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { AvailableFilters, JiraAnalyticsFilters, JiraAnalytics } from '@/lib/types';
|
import { AvailableFilters, JiraAnalyticsFilters, JiraAnalytics } from '@/lib/types';
|
||||||
|
|
||||||
export interface FiltersResult {
|
export interface FiltersResult {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use server';
|
'use server';
|
||||||
|
|
||||||
import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics';
|
import { JiraAnalyticsService, JiraAnalyticsConfig } from '@/services/jira-analytics';
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { SprintDetails } from '@/components/jira/SprintDetailModal';
|
import { SprintDetails } from '@/components/jira/SprintDetailModal';
|
||||||
import { JiraTask, AssigneeDistribution, StatusDistribution, SprintVelocity } from '@/lib/types';
|
import { JiraTask, AssigneeDistribution, StatusDistribution, SprintVelocity } from '@/lib/types';
|
||||||
import { parseDate } from '@/lib/date-utils';
|
import { parseDate } from '@/lib/date-utils';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use server';
|
'use server';
|
||||||
|
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { KanbanFilters, ViewPreferences, ColumnVisibility, TaskStatus } from '@/lib/types';
|
import { KanbanFilters, ViewPreferences, ColumnVisibility, TaskStatus } from '@/lib/types';
|
||||||
import { revalidatePath } from 'next/cache';
|
import { revalidatePath } from 'next/cache';
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use server';
|
'use server';
|
||||||
|
|
||||||
import { SystemInfoService } from '@/services/system-info';
|
import { SystemInfoService } from '@/services/core/system-info';
|
||||||
|
|
||||||
export async function getSystemInfo() {
|
export async function getSystemInfo() {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use server';
|
'use server';
|
||||||
|
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { revalidatePath } from 'next/cache';
|
import { revalidatePath } from 'next/cache';
|
||||||
import { tfsService, TfsConfig } from '@/services/tfs';
|
import { tfsService, TfsConfig } from '@/services/tfs';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { NextRequest, NextResponse } from 'next/server';
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
import { prisma } from '@/services/database';
|
import { prisma } from '@/services/core/database';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Route GET /api/jira/logs
|
* Route GET /api/jira/logs
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { NextResponse } from 'next/server';
|
import { NextResponse } from 'next/server';
|
||||||
import { createJiraService, JiraService } from '@/services/jira';
|
import { createJiraService, JiraService } from '@/services/jira';
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { jiraScheduler } from '@/services/jira-scheduler';
|
import { jiraScheduler } from '@/services/jira-scheduler';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { NextRequest, NextResponse } from 'next/server';
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
import { createJiraService } from '@/services/jira';
|
import { createJiraService } from '@/services/jira';
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* POST /api/jira/validate-project
|
* POST /api/jira/validate-project
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { NextRequest, NextResponse } from 'next/server';
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { JiraConfig } from '@/lib/types';
|
import { JiraConfig } from '@/lib/types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { NextRequest, NextResponse } from 'next/server';
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/user-preferences - Récupère toutes les préférences utilisateur
|
* GET /api/user-preferences - Récupère toutes les préférences utilisateur
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { JiraDashboardPageClient } from './JiraDashboardPageClient';
|
import { JiraDashboardPageClient } from './JiraDashboardPageClient';
|
||||||
|
|
||||||
// Force dynamic rendering
|
// Force dynamic rendering
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import "./globals.css";
|
|||||||
import { ThemeProvider } from "@/contexts/ThemeContext";
|
import { ThemeProvider } from "@/contexts/ThemeContext";
|
||||||
import { JiraConfigProvider } from "@/contexts/JiraConfigContext";
|
import { JiraConfigProvider } from "@/contexts/JiraConfigContext";
|
||||||
import { UserPreferencesProvider } from "@/contexts/UserPreferencesContext";
|
import { UserPreferencesProvider } from "@/contexts/UserPreferencesContext";
|
||||||
import { userPreferencesService } from "@/services/user-preferences";
|
import { userPreferencesService } from "@/services/core/user-preferences";
|
||||||
|
|
||||||
const geistSans = Geist({
|
const geistSans = Geist({
|
||||||
variable: "--font-geist-sans",
|
variable: "--font-geist-sans",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { userPreferencesService } from '@/services/user-preferences';
|
import { userPreferencesService } from '@/services/core/user-preferences';
|
||||||
import { IntegrationsSettingsPageClient } from '@/components/settings/IntegrationsSettingsPageClient';
|
import { IntegrationsSettingsPageClient } from '@/components/settings/IntegrationsSettingsPageClient';
|
||||||
|
|
||||||
// Force dynamic rendering for real-time data
|
// Force dynamic rendering for real-time data
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { SystemInfoService } from '@/services/system-info';
|
import { SystemInfoService } from '@/services/core/system-info';
|
||||||
import { SettingsIndexPageClient } from '@/components/settings/SettingsIndexPageClient';
|
import { SettingsIndexPageClient } from '@/components/settings/SettingsIndexPageClient';
|
||||||
|
|
||||||
// Force dynamic rendering (no static generation)
|
// Force dynamic rendering (no static generation)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { useState, useEffect, useTransition } from 'react';
|
|||||||
import { backupClient } from '@/clients/backup-client';
|
import { backupClient } from '@/clients/backup-client';
|
||||||
import { jiraClient } from '@/clients/jira-client';
|
import { jiraClient } from '@/clients/jira-client';
|
||||||
import { getSystemInfo } from '@/actions/system-info';
|
import { getSystemInfo } from '@/actions/system-info';
|
||||||
import { SystemInfo } from '@/services/system-info';
|
import { SystemInfo } from '@/services/core/system-info';
|
||||||
import { QuickStats } from './index/QuickStats';
|
import { QuickStats } from './index/QuickStats';
|
||||||
import { SettingsNavigation } from './index/SettingsNavigation';
|
import { SettingsNavigation } from './index/SettingsNavigation';
|
||||||
import { QuickActions } from './index/QuickActions';
|
import { QuickActions } from './index/QuickActions';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { Card, CardContent } from '@/components/ui/Card';
|
import { Card, CardContent } from '@/components/ui/Card';
|
||||||
import { UserPreferences } from '@/lib/types';
|
import { UserPreferences } from '@/lib/types';
|
||||||
import { SystemInfo } from '@/services/system-info';
|
import { SystemInfo } from '@/services/core/system-info';
|
||||||
|
|
||||||
interface QuickStatsProps {
|
interface QuickStatsProps {
|
||||||
preferences: UserPreferences;
|
preferences: UserPreferences;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { Card, CardHeader, CardContent } from '@/components/ui/Card';
|
import { Card, CardHeader, CardContent } from '@/components/ui/Card';
|
||||||
import { SystemInfo as SystemInfoType } from '@/services/system-info';
|
import { SystemInfo as SystemInfoType } from '@/services/core/system-info';
|
||||||
|
|
||||||
interface SystemInfoProps {
|
interface SystemInfoProps {
|
||||||
systemInfo: SystemInfoType | null;
|
systemInfo: SystemInfoType | null;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Task, TaskStatus, TaskPriority, TaskSource } from '@/lib/types';
|
import { Task, TaskStatus, TaskPriority, TaskSource } from '@/lib/types';
|
||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { getToday, parseDate, subtractDays } from '@/lib/date-utils';
|
import { getToday, parseDate, subtractDays } from '@/lib/date-utils';
|
||||||
|
|
||||||
export interface ProductivityMetrics {
|
export interface ProductivityMetrics {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { promises as fs } from 'fs';
|
import { promises as fs } from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { userPreferencesService } from './user-preferences';
|
import { userPreferencesService } from './core/user-preferences';
|
||||||
import { BackupUtils } from '../lib/backup-utils';
|
import { BackupUtils } from '../lib/backup-utils';
|
||||||
import { getToday } from '@/lib/date-utils';
|
import { getToday } from '@/lib/date-utils';
|
||||||
|
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ export class SystemInfoService {
|
|||||||
private static async getBackupCount(): Promise<number> {
|
private static async getBackupCount(): Promise<number> {
|
||||||
try {
|
try {
|
||||||
// Import dynamique pour éviter les dépendances circulaires
|
// Import dynamique pour éviter les dépendances circulaires
|
||||||
const { backupService } = await import('./backup');
|
const { backupService } = await import('../backup');
|
||||||
const backups = await backupService.listBackups();
|
const backups = await backupService.listBackups();
|
||||||
return backups.length;
|
return backups.length;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { Prisma } from '@prisma/client';
|
import { Prisma } from '@prisma/client';
|
||||||
import { DailyCheckbox, DailyView, CreateDailyCheckboxData, UpdateDailyCheckboxData, BusinessError, DailyCheckboxType, TaskStatus, TaskPriority, TaskSource } from '@/lib/types';
|
import { DailyCheckbox, DailyView, CreateDailyCheckboxData, UpdateDailyCheckboxData, BusinessError, DailyCheckboxType, TaskStatus, TaskPriority, TaskSource } from '@/lib/types';
|
||||||
import { getPreviousWorkday, normalizeDate, formatDateForAPI, getToday, getYesterday } from '@/lib/date-utils';
|
import { getPreviousWorkday, normalizeDate, formatDateForAPI, getToday, getYesterday } from '@/lib/date-utils';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { userPreferencesService } from './user-preferences';
|
import { userPreferencesService } from './core/user-preferences';
|
||||||
import { JiraService } from './jira';
|
import { JiraService } from './jira';
|
||||||
import { addMinutes, getToday } from '@/lib/date-utils';
|
import { addMinutes, getToday } from '@/lib/date-utils';
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { JiraTask } from '@/lib/types';
|
import { JiraTask } from '@/lib/types';
|
||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { parseDate, formatDateForDisplay } from '@/lib/date-utils';
|
import { parseDate, formatDateForDisplay } from '@/lib/date-utils';
|
||||||
|
|
||||||
export interface JiraConfig {
|
export interface JiraConfig {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { startOfWeek, endOfWeek } from 'date-fns';
|
import { startOfWeek, endOfWeek } from 'date-fns';
|
||||||
import { getToday } from '@/lib/date-utils';
|
import { getToday } from '@/lib/date-utils';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { startOfWeek, endOfWeek, eachDayOfInterval, format, startOfDay, endOfDay } from 'date-fns';
|
import { startOfWeek, endOfWeek, eachDayOfInterval, format, startOfDay, endOfDay } from 'date-fns';
|
||||||
import { fr } from 'date-fns/locale';
|
import { fr } from 'date-fns/locale';
|
||||||
import { formatDateForAPI, getDayName, getToday, subtractDays } from '@/lib/date-utils';
|
import { formatDateForAPI, getDayName, getToday, subtractDays } from '@/lib/date-utils';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { Prisma } from '@prisma/client';
|
import { Prisma } from '@prisma/client';
|
||||||
import { Tag } from '@/lib/types';
|
import { Tag } from '@/lib/types';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { Task, TaskStatus, TaskPriority, TaskSource, BusinessError, DailyCheckbox, DailyCheckboxType } from '@/lib/types';
|
import { Task, TaskStatus, TaskPriority, TaskSource, BusinessError, DailyCheckbox, DailyCheckboxType } from '@/lib/types';
|
||||||
import { Prisma } from '@prisma/client';
|
import { Prisma } from '@prisma/client';
|
||||||
import { getToday } from '@/lib/date-utils';
|
import { getToday } from '@/lib/date-utils';
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { TfsPullRequest } from '@/lib/types';
|
import { TfsPullRequest } from '@/lib/types';
|
||||||
import { prisma } from './database';
|
import { prisma } from './core/database';
|
||||||
import { parseDate, formatDateForDisplay } from '@/lib/date-utils';
|
import { parseDate, formatDateForDisplay } from '@/lib/date-utils';
|
||||||
import { userPreferencesService } from './user-preferences';
|
import { userPreferencesService } from './core/user-preferences';
|
||||||
|
|
||||||
export interface TfsConfig {
|
export interface TfsConfig {
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
|
|||||||
Reference in New Issue
Block a user