dt-common-device
Version:
A secure and robust device management library for IoT applications
183 lines (182 loc) • 7.99 kB
TypeScript
import { IssueRepository } from "./Issue.repository";
import { IIssueDocument } from "./Issue.model";
import { CreateIssueData, UpdateIssueData, AddCommentData, IssueStatus, IssuePriority, IssuesCategory, EntityType } from "./issue.types";
import { IssueBuilder } from "./IssueBuilder";
import { Source } from "../constants/Service";
import { IDevice } from "../device/local/interfaces";
export declare class IssueService {
private readonly issueRepository;
constructor(issueRepository: IssueRepository);
/**
* Create a readiness issue using IssueBuilder
*/
createReadinessIssue(propertyId: string, title: string, description: string, createdBy: string, entityId?: string, entityType?: EntityType, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create an operations issue using IssueBuilder
*/
createOperationsIssue(propertyId: string, title: string, description: string, createdBy: string, entityId?: string, entityType?: EntityType, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create a security issue using IssueBuilder
*/
createSecurityIssue(propertyId: string, title: string, description: string, createdBy: string, entityId?: string, entityType?: EntityType, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create an energy issue using IssueBuilder
*/
createEnergyIssue(propertyId: string, title: string, description: string, createdBy: string, entityId?: string, entityType?: EntityType, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create a device-specific issue using IssueBuilder
*/
createDeviceIssue(deviceId: string, propertyId: string, title: string, description: string, source: Source, category?: IssuesCategory, priority?: IssuePriority, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create a hub-specific issue using IssueBuilder
*/
createHubIssue(hubId: string, propertyId: string, title: string, description: string, createdBy: string, category?: IssuesCategory, priority?: IssuePriority, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create a user-specific issue using IssueBuilder
*/
createUserIssue(userId: string, propertyId: string, title: string, description: string, createdBy: string, category?: IssuesCategory, priority?: IssuePriority, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create issue for device going offline longer than baseline
*/
createDeviceOfflineIssue(device: IDevice, source: Source, reason?: string): Promise<IIssueDocument>;
/**
* Create issue for device battery level below threshold (READINESS + OPERATIONAL + ENERGY)
*/
createDeviceBatteryIssue(device: IDevice, batteryLevel: number, threshold: number, source: Source): Promise<IIssueDocument>;
/**
* Create issue for device malfunction (jammed or not accepting codes) (READINESS + OPERATIONAL)
*/
createDeviceMalfunctionIssue(device: IDevice, issueType: string, source: Source, reason?: string): Promise<IIssueDocument>;
/**
* Create a maintenance issue using IssueBuilder
*/
createMaintenanceIssue(propertyId: string, title: string, description: string, createdBy: string, entityId?: string, entityType?: EntityType, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create an urgent issue using IssueBuilder
*/
createUrgentIssue(propertyId: string, title: string, description: string, createdBy: string, entityId?: string, entityType?: EntityType, assignedTo?: string, dueDate?: Date): Promise<IIssueDocument>;
/**
* Create a new issue with business logic validation
* Accepts either a CreateIssueData object or an IssueBuilder instance
*/
createIssue(issueData: CreateIssueData | IssueBuilder): Promise<IIssueDocument>;
/**
* Get issue by ID with business logic
*/
getIssueById(id: string, includeDeleted?: boolean): Promise<IIssueDocument | null>;
/**
* Get all issues with business logic filtering
*/
getIssues(filters?: {
propertyId?: string;
assignedTo?: string;
status?: IssueStatus;
priority?: IssuePriority;
category?: IssuesCategory;
entityType?: EntityType;
entityId?: string;
includeDeleted?: boolean;
limit?: number;
skip?: number;
}): Promise<IIssueDocument[]>;
/**
* Update an issue with business logic validation
*/
updateIssue(id: string, updateData: UpdateIssueData): Promise<IIssueDocument | null>;
/**
* Soft delete an issue with business logic
*/
deleteIssue(id: string, deletedBy: string): Promise<boolean>;
/**
* Permanently delete an issue
*/
permanentlyDeleteIssue(id: string): Promise<boolean>;
/**
* Add a comment with business logic
*/
addComment(issueId: string, commentData: AddCommentData): Promise<IIssueDocument | null>;
/**
* Update a comment on an issue
*/
updateComment(issueId: string, commentId: string, content: string, userId: string): Promise<boolean>;
/**
* Remove a comment from an issue
*/
removeComment(issueId: string, commentId: string): Promise<boolean>;
/**
* Resolve an issue with business logic
*/
resolveIssue(id: string, resolvedBy: string): Promise<IIssueDocument | null>;
/**
* Reopen a resolved issue
*/
reopenIssue(id: string, reopenedBy: string): Promise<IIssueDocument | null>;
/**
* Assign an issue with business logic
*/
assignIssue(id: string, userId: string, assignedBy: string): Promise<IIssueDocument | null>;
/**
* Unassign an issue
*/
unassignIssue(id: string, unassignedBy: string): Promise<IIssueDocument | null>;
/**
* Get issues by property with business logic
*/
getIssuesByProperty(propertyId: string, includeDeleted?: boolean): Promise<IIssueDocument[]>;
/**
* Get issues assigned to a user with business logic
*/
getIssuesByAssignee(assignedTo: string, includeDeleted?: boolean): Promise<IIssueDocument[]>;
/**
* Get issues by entity
*/
getIssuesByEntity(entityId: string, entityType: EntityType, includeDeleted?: boolean): Promise<IIssueDocument[]>;
/**
* Get issues by status
*/
getIssuesByStatus(status: IssueStatus, includeDeleted?: boolean): Promise<IIssueDocument[]>;
/**
* Get issues by priority
*/
getIssuesByPriority(priority: IssuePriority, includeDeleted?: boolean): Promise<IIssueDocument[]>;
/**
* Get overdue issues with business logic
*/
getOverdueIssues(includeDeleted?: boolean): Promise<IIssueDocument[]>;
/**
* Get upcoming issues (due within specified days)
*/
getUpcomingIssues(days?: number, includeDeleted?: boolean): Promise<IIssueDocument[]>;
/**
* Get issue statistics with business logic
*/
getIssueStatistics(propertyId?: string): Promise<{
total: number;
pending: number;
inProgress: number;
resolved: number;
closed: number;
overdue: number;
byPriority: Record<IssuePriority, number>;
byCategory: Record<IssuesCategory, number>;
}>;
/**
* Search issues with business logic
*/
searchIssues(searchTerm: string, filters?: {
propertyId?: string;
includeDeleted?: boolean;
limit?: number;
skip?: number;
}): Promise<IIssueDocument[]>;
private validateIssueData;
private validateFilters;
private validateUpdateData;
private validateStatusTransition;
private validatePriorityChange;
private determineDefaultPriority;
private applyBusinessRules;
private shouldUpdateStatusOnComment;
private calculateAverageResponseTime;
private calculateResolutionRate;
}