From bd64a1ae0394d774855f3632d467df8965cc7c39 Mon Sep 17 00:00:00 2001 From: Rafael de Jesus Guzman Torres Date: Thu, 28 May 2026 22:22:34 -0600 Subject: [PATCH] feat: adding validation to decimals in range of 0 to 100 in checklist class --- .../modules/checklist/core/model/CheckList.ts | 16 ++++++------- .../core/objects/PercentageCompleted.ts | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 backend/src/modules/checklist/core/objects/PercentageCompleted.ts diff --git a/backend/src/modules/checklist/core/model/CheckList.ts b/backend/src/modules/checklist/core/model/CheckList.ts index 3e603b6c..f3dd92e3 100644 --- a/backend/src/modules/checklist/core/model/CheckList.ts +++ b/backend/src/modules/checklist/core/model/CheckList.ts @@ -4,7 +4,6 @@ import IdEntity from '../../../shared/core/objects/IdEntity'; import Text from '../../../shared/core/objects/Text'; import Version from '../../../shared/core/objects/Version'; import DeletedAt from '../../../shared/core/objects/DeletedAt'; -import Decimal from '../../../shared/core/objects/Decimal'; import type CheckListParams from '../interfaces/CheckListParams'; import ChecklistItem from '../objects/ChecklistItem'; import IdCheckList from '../objects/IdCheckList'; @@ -17,13 +16,14 @@ import ChecklistItemCompleted from '../events/ChecklistItemCompleted'; import ChecklistItemMarkedAsPending from '../events/ChecklistItemMarkedAsPending'; import ChecklistItemTitleUpdated from '../events/ChecklistItemTitleUpdated'; import ResourceNotFound from '../../../shared/core/errors/ResourceNotFound'; +import PercentageCompleted from '../objects/PercentageCompleted'; export default class CheckList extends Entity { private name!: Text; private items: ChecklistItem[] = []; - private completedPercentage!: Decimal; + private completedPercentage!: PercentageCompleted; - private constructor(id: IdCheckList, owner: IdEntity, name: Text, items: ChecklistItem[], completedPercentage: Decimal) { + private constructor(id: IdCheckList, owner: IdEntity, name: Text, items: ChecklistItem[], completedPercentage: PercentageCompleted) { super(id, owner); this.name = name; this.items = items; @@ -38,7 +38,7 @@ export default class CheckList extends Entity { key: string, items: ChecklistItem[] = [], ): CheckList { - const checklist = new CheckList(id, owner, name, items, new Decimal(0)); + const checklist = new CheckList(id, owner, name, items, new PercentageCompleted(0)); checklist.create(); checklist.recalculateCompletedPercentage(); checklist.addEvent(new CheckListCreated(key, DateTime.now(), actor, checklist.getOwnerId(), id, checklist.toPrimitives())); @@ -52,7 +52,7 @@ export default class CheckList extends Entity { new IdEntity(params.idOwner), new Text(params.name), items, - new Decimal(params.completedPercentage), + new PercentageCompleted(params.completedPercentage), ); checklist.build(new Version(params.version), DeletedAt.createFromPrimitive(params.deletedAt)); @@ -67,7 +67,7 @@ export default class CheckList extends Entity { return [...this.items]; } - public getCompletedPercentage(): Decimal { + public getCompletedPercentage(): PercentageCompleted { return this.completedPercentage; } @@ -155,12 +155,12 @@ export default class CheckList extends Entity { private recalculateCompletedPercentage(): void { if (this.items.length === 0) { - this.completedPercentage = new Decimal(0); + this.completedPercentage = new PercentageCompleted(0); return; } const completedCount = this.items.filter((item) => item.isCompleted()).length; const percent = (completedCount / this.items.length) * 100; - this.completedPercentage = new Decimal(percent); + this.completedPercentage = new PercentageCompleted(percent); } } diff --git a/backend/src/modules/checklist/core/objects/PercentageCompleted.ts b/backend/src/modules/checklist/core/objects/PercentageCompleted.ts new file mode 100644 index 00000000..bb8170e5 --- /dev/null +++ b/backend/src/modules/checklist/core/objects/PercentageCompleted.ts @@ -0,0 +1,23 @@ +import InvalidParameters from '../../../shared/core/errors/InvalidParameters'; +import Decimal from '../../../shared/core/objects/Decimal'; +import ValueObject from '../../../shared/core/objects/ValueObject'; + +export default class PercentageCompleted extends ValueObject { + private value!: Decimal; + + constructor(value: number) { + super(); + this.value = new Decimal(value); + if (this.value.getValue() < 0 || this.value.getValue() > 100) { + throw new InvalidParameters('Value must be in 0 to 100 range', { value }); + } + } + + public getValue(): number { + return this.value.getValue(); + } + + public toPrimitive(): number { + return this.value.toPrimitive(); + } +}