1
0
forked from Yara724/api

YARA-1045

This commit is contained in:
SepehrYahyaee
2026-06-23 13:31:04 +03:30
parent e2b879d943
commit cca3ed01a4
5 changed files with 40 additions and 30 deletions

View File

@@ -45,6 +45,10 @@ import {
buildExpertAssignConflictForOtherReviewer,
resolvePersistentReviewAssigneeId,
} from "src/helpers/expert-workflow-review-assignee";
import {
EXPERT_WORKFLOW_LOCK_TTL_MS,
expertWorkflowLockExpiredAt,
} from "src/helpers/expert-workflow-lock";
import { ClaimPerIdRs } from "./dto/claim-list-perId-rs.dto";
import { ClaimListDtoRs } from "./dto/claim-list-rs.dto";
import { ClaimCaseDbService } from "src/claim-request-management/entites/db-service/claim-case.db.service";
@@ -162,9 +166,6 @@ import { canonicalizeResendDocumentKey } from "src/helpers/claim-resend-document
export class ExpertClaimService {
private readonly logger = new Logger(ExpertClaimService.name);
/** Matches blame v2 `workflow` lock TTL: locker may re-enter until expired, then others may open. */
private readonly claimV2WorkflowLockTtlMs = 15 * 60 * 1000;
private readonly priceDropPart = {
backFender: {
Minor: 2,
@@ -777,7 +778,7 @@ export class ExpertClaimService {
throw new BadRequestException("Request has damage expert reply");
}
const fifteenMinutes = new Date(Date.now() + 15 * 60 * 1000);
const lockExpiresAt = expertWorkflowLockExpiredAt();
const lockSnapshot = await this.snapshotDamageExpert(actorDetail.sub);
await this.claimRequestManagementDbService.findOneAndUpdate(
@@ -785,7 +786,7 @@ export class ExpertClaimService {
{
lockFile: true,
claimStatus: ReqClaimStatus.ReviewRequest,
unlockTime: fifteenMinutes,
unlockTime: lockExpiresAt,
lockTime: Date.now(),
$set: {
actorLocked: {
@@ -814,7 +815,7 @@ export class ExpertClaimService {
idempotencyKey: `claim:${requestId}:checked:${actorDetail.sub}`,
});
this.unlockApi(request, fifteenMinutes.getTime() - Date.now());
this.unlockApi(request, lockExpiresAt.getTime() - Date.now());
return { _id: requestId, lock: true };
}
@@ -2548,7 +2549,7 @@ export class ExpertClaimService {
const now = new Date();
const lockSnapshot = await this.snapshotDamageExpert(actor.sub);
const expiredAt = new Date(now.getTime() + this.claimV2WorkflowLockTtlMs);
const expiredAt = new Date(now.getTime() + EXPERT_WORKFLOW_LOCK_TTL_MS);
const actorType = isFieldExpertOwner ? "field_expert" : "damage_expert";
const actorRoleLabel = isFieldExpertOwner
? ("field_expert" as const)
@@ -4034,7 +4035,7 @@ export class ExpertClaimService {
}
const la = claim.workflow?.lockedAt as Date | string | undefined;
if (!la) return true;
return Date.now() < new Date(la).getTime() + this.claimV2WorkflowLockTtlMs;
return Date.now() < new Date(la).getTime() + EXPERT_WORKFLOW_LOCK_TTL_MS;
}
/**
@@ -4048,7 +4049,7 @@ export class ExpertClaimService {
}): Promise<void> {
if ((actor as any).role === RoleEnum.FIELD_EXPERT) return;
const clientKey = requireActorClientKey(actor);
const lockTtlMs = this.claimV2WorkflowLockTtlMs;
const lockTtlMs = EXPERT_WORKFLOW_LOCK_TTL_MS;
const now = new Date();
const candidates = (await this.claimCaseDbService.find(
{
@@ -4094,7 +4095,7 @@ export class ExpertClaimService {
const expiredAt = claim.workflow?.expiredAt;
const lockedAt = claim.workflow?.lockedAt;
const now = Date.now();
const ttl = this.claimV2WorkflowLockTtlMs;
const ttl = EXPERT_WORKFLOW_LOCK_TTL_MS;
if (expiredAt && now < new Date(expiredAt as Date).getTime()) return false;
if (
@@ -4199,7 +4200,7 @@ export class ExpertClaimService {
* - Claim must exist and belong to the actor's insurer (`assertClaimCaseForTenant`)
* - Allowed when: WAITING_FOR_DAMAGE_EXPERT (queue), or EXPERT_REVIEWING (after lock — same expert must be able to reopen detail),
* or factor-validation queue (EXPERT_VALIDATING_REPAIR_FACTORS / legacy WAITING_FOR_INSURER_APPROVAL + UNDER_REVIEW + EXPERT_COST_EVALUATION)
* - If an active workflow lock exists (15 min from lockedAt): only the locking expert; after expiry, any expert (tenant) may view
* - If an active workflow lock exists (30 min from lockedAt): only the locking expert; after expiry, any expert (tenant) may view
*/
async getClaimDetailV2(
claimRequestId: string,