pmtool / src /services /timeLogApi.ts
devarshia5's picture
Upload 487 files
d97b8f9 verified
Raw
History Blame Contribute Delete
8.76 kB
import axios from 'axios';
import { API_BASE_URL } from '@/config';
import apiClient from '@/lib/api/axios-instance';
import { createHeaders } from '@/lib/api';
export interface TimeLog {
id: number;
workDate: string;
startTime: string;
endTime: string;
comments: string;
createdBy: string;
updatedBy: string;
createdDate: string;
updatedDate: string;
remainingHr: number;
taskId: number;
hrsSpent: number;
}
export interface TimeLogCreateRequest {
id?: number;
workDate: string;
startTime: string;
endTime: string;
comments: string;
createdBy: string;
updatedBy: string;
createdDate?: string;
updatedDate?: string;
remainingHr: number;
taskId: number;
hrsSpent: number;
}
export interface TimeLogUpdateRequest extends TimeLogCreateRequest {
id: number;
}
export interface PaginatedResponse<T> {
data: T[];
pageNumber: number;
pageSize: number;
totalCount: number;
totalPages: number;
}
// Helper to create a safe TimeLog object with default values for null/undefined fields
const createSafeTimeLog = (data: any): TimeLog => {
return {
id: data.id || 0,
workDate: data.workDate || new Date().toISOString(),
startTime: data.startTime || '00:00',
endTime: data.endTime || '00:00',
comments: data.comments || '',
createdBy: data.createdBy || '',
updatedBy: data.updatedBy || '',
createdDate: data.createdDate || new Date().toISOString(),
updatedDate: data.updatedDate || new Date().toISOString(),
remainingHr: data.remainingHr || 0,
taskId: data.taskId || 0,
hrsSpent: data.hrsSpent || 0,
};
};
class TimeLogApi {
private baseUrl = `/api/TimeLog`;
async getAll(): Promise<TimeLog[]> {
try {
console.log('TimeLogApi: Fetching all time logs from', this.baseUrl);
const response = await apiClient.get(this.baseUrl);
console.log('TimeLogApi: Response status', response.status);
if (!response.data) {
console.warn('TimeLogApi: No data in response');
return [];
}
if (!Array.isArray(response.data)) {
console.warn('TimeLogApi: Response is not an array', response.data);
return [];
}
// Map each item to ensure it has all required fields
return response.data.map(item => createSafeTimeLog(item));
} catch (error) {
console.error('Error fetching time logs:', error);
// Return empty array instead of throwing to prevent UI crashes
return [];
}
}
async getById(id: number): Promise<TimeLog | null> {
try {
const response = await apiClient.get(`${this.baseUrl}/${id}`);
if (response.data) {
return createSafeTimeLog(response.data);
}
return null;
} catch (error) {
console.error(`Error fetching time log ${id}:`, error);
return null;
}
}
async getTimeLogByTaskID(taskId: number): Promise<TimeLog[]> {
try {
console.log(`TimeLogApi: Fetching time logs for task ${taskId}`);
const response = await apiClient.get(`${this.baseUrl}/GetTimeLogByTaskID?taskId=${taskId}`);
console.log(`TimeLogApi: Response status for task ${taskId} time logs`, response.status);
if (!response.data) {
console.warn(`TimeLogApi: No time logs found for task ${taskId}`);
return [];
}
if (!Array.isArray(response.data)) {
console.warn(`TimeLogApi: Response is not an array for task ${taskId}`, response.data);
return [];
}
// Map each item to ensure it has all required fields
return response.data.map((item: any) => createSafeTimeLog(item));
} catch (error) {
console.error(`Error fetching time logs for task ${taskId}:`, error);
// Return empty array instead of throwing to prevent UI crashes
return [];
}
}
async getTimeLogByIssueID(issueId: number): Promise<TimeLog[]> {
try {
console.log(`TimeLogApi: Fetching time logs for issue ${issueId}`);
const response = await apiClient.get(`${this.baseUrl}/by-issue/${issueId}`);
console.log(`TimeLogApi: Response status for issue ${issueId} time logs`, response.status);
if (!response.data) {
console.warn(`TimeLogApi: No time logs found for issue ${issueId}`);
return [];
}
if (!Array.isArray(response.data)) {
console.warn(`TimeLogApi: Response is not an array for issue ${issueId}`, response.data);
return [];
}
// Map each item to ensure it has all required fields
return response.data.map((item: any) => createSafeTimeLog(item));
} catch (error) {
console.error(`Error fetching time logs for issue ${issueId}:`, error);
// Return empty array instead of throwing to prevent UI crashes
return [];
}
}
async create(timeLog: TimeLogCreateRequest): Promise<TimeLog> {
try {
// Remove id if it's 0, undefined, or null
const timeLogData = { ...timeLog };
if (timeLogData.id === 0 || timeLogData.id === undefined || timeLogData.id === null) {
delete timeLogData.id;
}
// Format the workDate if it's a string without time part
if (timeLogData.workDate && typeof timeLogData.workDate === 'string') {
if (!timeLogData.workDate.includes('T')) {
timeLogData.workDate = timeLogData.workDate + 'T00:00:00.000Z';
}
}
console.log('TimeLogApi: Creating time log with data', timeLogData);
const response = await apiClient.post(this.baseUrl, timeLogData);
console.log('TimeLogApi: Create response status', response.status);
return createSafeTimeLog(response.data);
} catch (error) {
console.error('Error creating time log:', error);
throw error;
}
}
async update(id: number, timeLog: TimeLogUpdateRequest): Promise<TimeLog> {
try {
const timeLogData = { ...timeLog };
// Format the workDate if it's a string without time part
if (timeLogData.workDate && typeof timeLogData.workDate === 'string') {
if (!timeLogData.workDate.includes('T')) {
timeLogData.workDate = timeLogData.workDate + 'T00:00:00.000Z';
}
}
console.log(`TimeLogApi: Updating time log ${id} with data`, timeLogData);
const response = await apiClient.put(`${this.baseUrl}/${id}`, timeLogData);
console.log(`TimeLogApi: Update response status for time log ${id}`, response.status);
return createSafeTimeLog(response.data);
} catch (error) {
console.error(`Error updating time log ${id}:`, error);
throw error;
}
}
async delete(id: number): Promise<void> {
try {
console.log(`TimeLogApi: Deleting time log ${id}`);
await apiClient.delete(`${this.baseUrl}/${id}`);
console.log(`TimeLogApi: Time log ${id} deleted successfully`);
} catch (error) {
console.error(`Error deleting time log ${id}:`, error);
throw error;
}
}
async getPaginated(pageNumber: number = 1, pageSize: number = 10): Promise<PaginatedResponse<TimeLog>> {
try {
console.log(`TimeLogApi: Fetching paginated time logs (page ${pageNumber}, size ${pageSize})`);
const response = await apiClient.get(`${this.baseUrl}/paginated`, {
params: {
pageNumber,
pageSize
}
});
console.log('TimeLogApi: Paginated response status', response.status);
if (!response.data) {
console.warn('TimeLogApi: No data in paginated response');
return {
data: [],
pageNumber: 1,
pageSize: pageSize,
totalCount: 0,
totalPages: 0
};
}
// Map each item to ensure it has all required fields
const safeData = response.data.data.map((item: any) => createSafeTimeLog(item));
return {
data: safeData,
pageNumber: response.data.pageNumber,
pageSize: response.data.pageSize,
totalCount: response.data.totalCount,
totalPages: response.data.totalPages
};
} catch (error) {
console.error('Error fetching paginated time logs:', error);
// Return empty paginated response instead of throwing to prevent UI crashes
return {
data: [],
pageNumber: 1,
pageSize: pageSize,
totalCount: 0,
totalPages: 0
};
}
}
}
export const timeLogApi = new TimeLogApi();