fix: persist the prior-archive cutoff date when the owner changes it

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-18 16:31:19 +03:30
co-authored by Cursor
parent 23f8da2c65
commit 61d17c5cea
2 changed files with 21 additions and 5 deletions
+5
View File
@@ -2,12 +2,14 @@ import {
ArrayMinSize, ArrayMinSize,
IsArray, IsArray,
IsIn, IsIn,
IsISO8601,
IsNumber, IsNumber,
IsOptional, IsOptional,
IsString, IsString,
MaxLength, MaxLength,
Min, Min,
MinLength, MinLength,
ValidateIf,
ValidateNested, ValidateNested,
} from 'class-validator'; } from 'class-validator';
import { Type } from 'class-transformer'; import { Type } from 'class-transformer';
@@ -72,5 +74,8 @@ export class UpdateOrganizationDto {
export class UpdatePriorArchiveCutoffDto export class UpdatePriorArchiveCutoffDto
implements UpdatePriorArchiveCutoffRequest implements UpdatePriorArchiveCutoffRequest
{ {
/** بدون دکوراتور، whitelist پایپ Nest فیلد را حذف می‌کرد و ذخیره همیشه خطا می‌داد. */
@ValidateIf((_, value) => value !== null)
@IsISO8601()
cutoffAt!: string | null; cutoffAt!: string | null;
} }
+16 -5
View File
@@ -95,16 +95,23 @@ async function setPriorArchive(userId: string, enabled: boolean) {
function cutoffPayload(value: string): UpdatePriorArchiveCutoffRequest { function cutoffPayload(value: string): UpdatePriorArchiveCutoffRequest {
const parsed = parseLocalInput(value); const parsed = parseLocalInput(value);
return { cutoffAt: parsed ? parsed.toISOString() : null }; if (!parsed) return { cutoffAt: null };
// پایان همان روز محلی تا ایمپورت همان روز هم قبل از تاریخ قطع شمرده شود
parsed.setHours(23, 59, 59, 999);
return { cutoffAt: parsed.toISOString() };
}
function applyCutoffFromOrg(org: Pick<OrganizationDto, 'priorArchiveCutoffAt'>) {
cutoffLocal.value = org.priorArchiveCutoffAt
? formatLocalDateInput(new Date(org.priorArchiveCutoffAt))
: '';
} }
async function loadPriorArchiveCutoff() { async function loadPriorArchiveCutoff() {
cutoffLoading.value = true; cutoffLoading.value = true;
try { try {
const { data } = await api.get<OrganizationDto>('/organizations/current'); const { data } = await api.get<OrganizationDto>('/organizations/current');
cutoffLocal.value = data.priorArchiveCutoffAt applyCutoffFromOrg(data);
? formatLocalDateInput(new Date(data.priorArchiveCutoffAt))
: '';
} catch (e) { } catch (e) {
error.value = axios.isAxiosError(e) error.value = axios.isAxiosError(e)
? String((e.response?.data as { message?: string })?.message ?? 'بارگذاری تاریخ بایگانی ناموفق بود.') ? String((e.response?.data as { message?: string })?.message ?? 'بارگذاری تاریخ بایگانی ناموفق بود.')
@@ -120,7 +127,11 @@ async function onCutoffChange(value: string) {
error.value = ''; error.value = '';
ok.value = ''; ok.value = '';
try { try {
await api.patch('/organizations/current/prior-archive-cutoff', cutoffPayload(value)); const { data } = await api.patch<OrganizationDto>(
'/organizations/current/prior-archive-cutoff',
cutoffPayload(value),
);
applyCutoffFromOrg(data);
ok.value = value ? 'تاریخ بایگانی اطلاعات قبل ذخیره شد.' : 'تاریخ بایگانی اطلاعات قبل پاک شد.'; ok.value = value ? 'تاریخ بایگانی اطلاعات قبل ذخیره شد.' : 'تاریخ بایگانی اطلاعات قبل پاک شد.';
await auth.hydrate(); await auth.hydrate();
} catch (e) { } catch (e) {