import { Injectable } from '@nestjs/common';
import { AuthService } from '@/auth/auth.service';
import { ApiClientService } from '@/shared/http/api-client.service';
interface Project {
id: number;
name: string;
project_id?: number;
project_name?: string;
}
interface Module {
id?: number;
module_id?: number;
name?: string;
module_name?: string;
project_id: number;
}
interface ProjectWithModules {
projects: Project[];
modules: Module[];
}
/**
* Service for managing projects and modules
* Handles fetching and organizing project/module data
*/
@Injectable()
export class ProjectsService {
constructor(
private readonly authService: AuthService,
private readonly apiClient: ApiClientService,
) {}
/**
* Get current user's projects and their modules
* @returns Projects and modules for authenticated user
*/
async getUserProjectsAndModules(): Promise<ProjectWithModules> {
const user = this.authService.getCurrentUser();
const token = this.authService.getToken();
if (!user || !token) {
throw new Error('User not authenticated');
}
let projectsResponse = null;
let modulesResponse = null;
try {
projectsResponse = await this.apiClient.getUserProjects(user.id, token);
// If user has projects, fetch modules for the first project
if (projectsResponse?.data && projectsResponse.data.length > 0) {
const firstProject = projectsResponse.data[0];
const projectId = firstProject.id || firstProject.project_id;
if (projectId) {
modulesResponse = await this.apiClient.getModules(projectId, token);
}
}
} catch (error) {
console.warn('Failed to fetch projects/modules:', error.message);
}
return {
projects: projectsResponse?.data || [],
modules: modulesResponse?.data
? modulesResponse.data.map((module: any) => ({
id: module.module_id,
name: module.module_name,
project_id: module.project_id,
}))
: [],
};
}
/**
* Get all projects for current user
*/
async getAllUserProjects() {
const user = this.authService.getCurrentUser();
const token = this.authService.getToken();
if (!user || !token) {
throw new Error('User not authenticated');
}
try {
const response = await this.apiClient.getUserProjects(user.id, token);
return response?.data || [];
} catch (error) {
throw new Error(`Failed to fetch projects: ${error.message}`);
}
}
/**
* Get modules for a specific project
*/
async getModulesForProject(projectId: number) {
const token = this.authService.getToken();
if (!token) {
throw new Error('User not authenticated');
}
try {
const response = await this.apiClient.getModules(projectId, token);
return response?.data || [];
} catch (error) {
throw new Error(`Failed to fetch modules for project ${projectId}: ${error.message}`);
}
}
}