Rules Hub
Coding Rules Library
Rule priority, scope & exceptions
Use this to align rules with the senior-level structure (P0/P1/P2, scope, exceptions/tradeoffs).
Derive the next sequence value from MAX(col)+1, not COUNT(*)
Compute the next value for an ordering/sequence column with MAX(col)+1 rather than COUNT, since deletions break the COUNT-to-position mapping.
Bad example
| 1 | const nextOrder = await manager |
| 2 | .getRepository(Item) |
| 3 | .count({ where: { cartId } }); |
| 4 |
|
| 5 | newItem.order = nextOrder; |
Explanation (EN)
If a row is deleted, the row count no longer equals the highest existing order. The next inserted item reuses an order value an existing row already has, producing duplicates.
Objašnjenje (HR)
Ako se redak obrise, broj redaka vise nije jednak najvecem postojecem order-u. Sljedeci umetnuti element ponovno koristi vrijednost koju neki postojeci redak vec ima, sto stvara duplikate.
Good example
| 1 | const { maxOrder } = await manager |
| 2 | .getRepository(Item) |
| 3 | .createQueryBuilder('i') |
| 4 | .select('COALESCE(MAX(i.order), -1)', 'maxOrder') |
| 5 | .where('i.cart_id = :cartId', { cartId }) |
| 6 | .getRawOne(); |
| 7 |
|
| 8 | newItem.order = (maxOrder ?? -1) + 1; |
Explanation (EN)
MAX(order)+1 always yields a value greater than every existing order regardless of deletions, so the new row's position stays unique. COALESCE handles the empty-set case.
Objašnjenje (HR)
MAX(order)+1 uvijek daje vrijednost vecu od svakog postojeceg order-a bez obzira na brisanja, pa pozicija novog retka ostaje jedinstvena. COALESCE pokriva slucaj praznog skupa.