1
0
forked from Yara724/api
This commit is contained in:
SepehrYahyaee
2026-04-26 09:31:50 +03:30
parent 6c2d178686
commit 4f8cb43883
5 changed files with 37 additions and 2 deletions

View File

@@ -40,6 +40,10 @@ export class ClaimWorkflow {
@Prop({ type: Date }) @Prop({ type: Date })
lockedAt?: Date; lockedAt?: Date;
/** Lock expiry used by UI countdown (typically lockedAt + 15m). */
@Prop({ type: Date })
expiredAt?: Date;
@Prop({ type: ClaimActorLockSchema }) @Prop({ type: ClaimActorLockSchema })
lockedBy?: ClaimActorLock; lockedBy?: ClaimActorLock;
} }

View File

@@ -325,6 +325,7 @@ export class ExpertBlameService {
if (w) { if (w) {
w.locked = false; w.locked = false;
delete w.lockedAt; delete w.lockedAt;
delete w.expiredAt;
delete w.lockedBy; delete w.lockedBy;
} }
} }
@@ -444,7 +445,11 @@ export class ExpertBlameService {
filter as any, filter as any,
{ {
$set: { "workflow.locked": false }, $set: { "workflow.locked": false },
$unset: { "workflow.lockedAt": "", "workflow.lockedBy": "" }, $unset: {
"workflow.lockedAt": "",
"workflow.expiredAt": "",
"workflow.lockedBy": "",
},
}, },
{ new: false }, { new: false },
); );
@@ -953,6 +958,9 @@ export class ExpertBlameService {
$set: { $set: {
"workflow.locked": true, "workflow.locked": true,
"workflow.lockedAt": now, "workflow.lockedAt": now,
"workflow.expiredAt": new Date(
now.getTime() + this.blameV2LockTtlMs,
),
"workflow.lockedBy": { "workflow.lockedBy": {
actorId: new Types.ObjectId(actorDetail.sub), actorId: new Types.ObjectId(actorDetail.sub),
actorName: actorDetail.fullName || "Unknown Expert", actorName: actorDetail.fullName || "Unknown Expert",
@@ -1125,6 +1133,7 @@ export class ExpertBlameService {
}, },
$unset: { $unset: {
"workflow.lockedAt": "", "workflow.lockedAt": "",
"workflow.expiredAt": "",
"workflow.lockedBy": "", "workflow.lockedBy": "",
}, },
}; };
@@ -1308,6 +1317,7 @@ export class ExpertBlameService {
}, },
$unset: { $unset: {
"workflow.lockedAt": "", "workflow.lockedAt": "",
"workflow.expiredAt": "",
"workflow.lockedBy": "", "workflow.lockedBy": "",
}, },
}; };
@@ -1450,6 +1460,7 @@ export class ExpertBlameService {
}, },
$unset: { $unset: {
"workflow.lockedAt": "", "workflow.lockedAt": "",
"workflow.expiredAt": "",
"workflow.lockedBy": "", "workflow.lockedBy": "",
}, },
}; };

View File

@@ -28,6 +28,7 @@ export class ClaimDetailV2ResponseDto {
actorId: string; actorId: string;
actorName: string; actorName: string;
lockedAt: string; lockedAt: string;
expiredAt?: string;
}; };
@ApiPropertyOptional() @ApiPropertyOptional()

View File

@@ -2104,12 +2104,15 @@ export class ExpertClaimService {
} }
const lockSnapshot = await this.snapshotDamageExpert(actor.sub); const lockSnapshot = await this.snapshotDamageExpert(actor.sub);
const lockAt = new Date();
const expiredAt = new Date(lockAt.getTime() + this.claimV2WorkflowLockTtlMs);
await this.claimCaseDbService.findByIdAndUpdate(claimRequestId, { await this.claimCaseDbService.findByIdAndUpdate(claimRequestId, {
status: ClaimCaseStatus.EXPERT_REVIEWING, status: ClaimCaseStatus.EXPERT_REVIEWING,
claimStatus: ClaimStatus.UNDER_REVIEW, claimStatus: ClaimStatus.UNDER_REVIEW,
'workflow.locked': true, 'workflow.locked': true,
'workflow.lockedAt': new Date(), 'workflow.lockedAt': lockAt,
'workflow.expiredAt': expiredAt,
'workflow.lockedBy': { 'workflow.lockedBy': {
actorId: new Types.ObjectId(actor.sub), actorId: new Types.ObjectId(actor.sub),
actorName: actor.fullName, actorName: actor.fullName,
@@ -2206,6 +2209,7 @@ export class ExpertClaimService {
}, },
$unset: { $unset: {
"workflow.lockedAt": "", "workflow.lockedAt": "",
"workflow.expiredAt": "",
"workflow.lockedBy": "", "workflow.lockedBy": "",
}, },
$push: { $push: {
@@ -2372,6 +2376,11 @@ export class ExpertClaimService {
status: nextCaseStatus, status: nextCaseStatus,
claimStatus: nextClaimStatus, claimStatus: nextClaimStatus,
'workflow.locked': false, 'workflow.locked': false,
$unset: {
'workflow.lockedAt': '',
'workflow.expiredAt': '',
'workflow.lockedBy': '',
},
'workflow.currentStep': nextStep, 'workflow.currentStep': nextStep,
'workflow.nextStep': needsFactorUpload 'workflow.nextStep': needsFactorUpload
? ClaimWorkflowStep.INSURER_REVIEW ? ClaimWorkflowStep.INSURER_REVIEW
@@ -2486,6 +2495,11 @@ export class ExpertClaimService {
await this.claimCaseDbService.findByIdAndUpdate(claimRequestId, { await this.claimCaseDbService.findByIdAndUpdate(claimRequestId, {
claimStatus: ClaimStatus.NEEDS_REVISION, claimStatus: ClaimStatus.NEEDS_REVISION,
'workflow.locked': false, 'workflow.locked': false,
$unset: {
'workflow.lockedAt': '',
'workflow.expiredAt': '',
'workflow.lockedBy': '',
},
...(note ? { 'evaluation.visitLocation': note } : {}), ...(note ? { 'evaluation.visitLocation': note } : {}),
...(visitSnapshot && { ...(visitSnapshot && {
'evaluation.inPersonVisitExpertProfileSnapshot': visitSnapshot, 'evaluation.inPersonVisitExpertProfileSnapshot': visitSnapshot,
@@ -2952,6 +2966,7 @@ export class ExpertClaimService {
actorId: claim.workflow.lockedBy.actorId?.toString(), actorId: claim.workflow.lockedBy.actorId?.toString(),
actorName: claim.workflow.lockedBy.actorName, actorName: claim.workflow.lockedBy.actorName,
lockedAt: (claim.workflow as any).lockedAt?.toISOString(), lockedAt: (claim.workflow as any).lockedAt?.toISOString(),
expiredAt: (claim.workflow as any).expiredAt?.toISOString(),
} }
: undefined, : undefined,
owner: claim.owner owner: claim.owner

View File

@@ -42,6 +42,10 @@ export class Workflow {
@Prop({ type: Date }) @Prop({ type: Date })
lockedAt?: Date; lockedAt?: Date;
/** Lock expiry used by UI countdown (typically lockedAt + 15m). */
@Prop({ type: Date })
expiredAt?: Date;
@Prop({ type: ActorLockSchema }) @Prop({ type: ActorLockSchema })
lockedBy?: ActorLock; lockedBy?: ActorLock;
} }