fix(quick-260909-laa): dritte Eindeutigkeitsverletzung uebersetzen statt sie zu behaupten
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { ConflictException, Injectable } from '@nestjs/common';
|
||||
import { PrismaService } from '../prisma/prisma.service';
|
||||
import { forTenant } from '../prisma/prisma-tenant.extension';
|
||||
|
||||
@@ -39,6 +39,17 @@ export class TenderTriageService {
|
||||
* with the same params never creates a second row. Only the fields
|
||||
* present in `dto` are touched; the other flag (and its timestamp) is
|
||||
* left as-is on both the update and create branches.
|
||||
*
|
||||
* Gegenrichtung der Bindung (Befund F, 260909-laa): der Eindeutigkeits-
|
||||
* schluessel `@@unique([userId, tenderId])` traegt KEINE Mandanten-
|
||||
* dimension. Ist die vorhandene Zeile unter dem gebundenen Kontext
|
||||
* unsichtbar (veralteter Mandant in der Sitzung), findet das `upsert`
|
||||
* sie nicht, versucht anzulegen und laeuft in die Eindeutigkeits-
|
||||
* verletzung — aus stillem Ueberschreiben wird ein harter Fehler. Der
|
||||
* `P2002`-Zweig uebersetzt das in eine verstaendliche deutsche Meldung
|
||||
* statt in einen 500, wie in `tender-saved-search.service.ts`. Gemessen
|
||||
* in `rls-scratch-check.mjs`, Pruefung
|
||||
* `tendertriage-einfuegen-auf-unsichtbare-zeile-verletzt-eindeutigkeit`.
|
||||
*/
|
||||
async setTriage(
|
||||
userId: string,
|
||||
@@ -59,19 +70,28 @@ export class TenderTriageService {
|
||||
}
|
||||
|
||||
const tenantPrisma = forTenant(this.prisma, tenantId) as any;
|
||||
return tenantPrisma.tenderTriage.upsert({
|
||||
where: { userId_tenderId: { userId, tenderId } },
|
||||
update,
|
||||
create: {
|
||||
userId,
|
||||
tenantId,
|
||||
tenderId,
|
||||
isRead: dto.isRead ?? false,
|
||||
isFavorite: dto.isFavorite ?? false,
|
||||
readAt: dto.isRead ? now : null,
|
||||
favoritedAt: dto.isFavorite ? now : null,
|
||||
},
|
||||
});
|
||||
try {
|
||||
return await tenantPrisma.tenderTriage.upsert({
|
||||
where: { userId_tenderId: { userId, tenderId } },
|
||||
update,
|
||||
create: {
|
||||
userId,
|
||||
tenantId,
|
||||
tenderId,
|
||||
isRead: dto.isRead ?? false,
|
||||
isFavorite: dto.isFavorite ?? false,
|
||||
readAt: dto.isRead ? now : null,
|
||||
favoritedAt: dto.isFavorite ? now : null,
|
||||
},
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error?.code === 'P2002') {
|
||||
throw new ConflictException(
|
||||
'Der Bearbeitungsstand zu dieser Ausschreibung konnte nicht gespeichert werden. Bitte die Seite neu laden und es erneut versuchen.',
|
||||
);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user