feat(pilot): do not add 2 umpires to the same splace

* placeholder fixes
This commit is contained in:
2026-06-05 11:37:47 +02:00
parent 12871ef7d2
commit 2fb8d34ec1
6 changed files with 268 additions and 54 deletions
@@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { db } from 'db';
import { db, Umpire } from 'db';
import { liveQuery } from 'dexie';
import { from } from 'rxjs';
@@ -21,8 +21,8 @@ export class WaitingServiceJudgesService {
/**
* Add new umpire to queue with max(order) + 1
*/
async add(serviceJudgeId: number): Promise<number> {
return db.transaction('rw', db.waitingServiceJudges, async () => {
async add(serviceJudgeId: number, toPosition?: number): Promise<number> {
const id = await db.transaction('rw', db.waitingServiceJudges, async () => {
const last = await db.waitingServiceJudges.orderBy('order').last();
const nextOrder = last ? last.order + 1 : 1;
@@ -32,6 +32,12 @@ export class WaitingServiceJudgesService {
order: nextOrder
});
});
if (toPosition !== undefined) {
await this.moveToPosition(serviceJudgeId, toPosition);
}
return id;
}
/**
@@ -39,6 +45,8 @@ export class WaitingServiceJudgesService {
*/
async remove(id: number): Promise<void> {
await db.waitingServiceJudges.delete(id);
await this.reinitOrders();
}
async removeByUmpireId(umpireId: number): Promise<void> {
@@ -51,7 +59,7 @@ export class WaitingServiceJudgesService {
return;
}
await db.waitingServiceJudges.delete(item.id);
await this.remove(item.id);
}
/**
@@ -67,4 +75,81 @@ export class WaitingServiceJudgesService {
async clear(): Promise<void> {
await db.waitingServiceJudges.clear();
}
async moveToPosition(umpireId: number, newOrder: number): Promise<void> {
await db.transaction('rw', db.waitingServiceJudges, async () => {
const current = await db.waitingServiceJudges
.where('serviceJudgeId')
.equals(umpireId)
.first();
if (!current) {
return;
}
const oldOrder = current.order;
if (oldOrder === newOrder) {
return;
}
if (newOrder < oldOrder) {
// Moving up: shift affected records down
const affected = await db.waitingServiceJudges
.filter(
(item) =>
item.order >= newOrder &&
item.order < oldOrder &&
item.id !== current.id
)
.toArray();
for (const item of affected) {
await db.waitingServiceJudges.update(item.id!, {
order: item.order + 1
});
}
} else {
// Moving down: shift affected records up
const affected = await db.waitingServiceJudges
.filter(
(item) =>
item.order > oldOrder &&
item.order <= newOrder &&
item.id !== current.id
)
.toArray();
for (const item of affected) {
await db.waitingServiceJudges.update(item.id!, {
order: item.order - 1
});
}
}
await db.waitingServiceJudges.update(current.id!, {
order: newOrder
});
});
}
async reinitOrders(): Promise<void> {
await db.transaction('rw', db.waitingServiceJudges, async () => {
const items = await db.waitingServiceJudges.orderBy('order').toArray();
for (let i = 0; i < items.length; i++) {
const item = items[i];
const expectedOrder = i + 1;
if (item.order !== expectedOrder) {
await db.waitingServiceJudges.update(item.id!, {
order: expectedOrder
});
}
}
});
}
}