import { BadRequestException, Injectable, NotFoundException, } from '@nestjs/common'; import { InvalidDateTimeError } from '../../../common/value-objects/date-time/invalid-date-time.error'; import { DateTime } from '../../../common/value-objects/date-time/date-time'; import { CompanySettingsRepository } from './company-settings.repository'; import type { CompanySetting } from './company-setting'; @Injectable() export class CompanySettingsService { constructor( private readonly companySettingsRepository: CompanySettingsRepository, ) {} async get(): Promise> { const setting = await this.companySettingsRepository.find(); if (!setting) { throw new NotFoundException('Settings not configured'); } return this.toItem(setting); } async update( cycleStartDateRaw: string, userId: string, ): Promise> { const cycleStartDate = this.assertDate(cycleStartDateRaw).startOfDay(); const saved = await this.companySettingsRepository.upsert({ cycleStartDate, userId, }); return this.toItem(saved); } async requireCycleStartDate(): Promise { const setting = await this.companySettingsRepository.find(); if (!setting) { throw new NotFoundException('Settings not configured'); } return setting.cycleStartDate; } toItem(setting: CompanySetting) { return { id: setting.id, cycleStartDate: setting.cycleStartDate.value, status: setting.status.value, createdAt: setting.createdAt.value, updatedAt: setting.updatedAt.value, createdBy: setting.createdBy, updatedBy: setting.updatedBy, }; } private assertDate(raw: string): DateTime { try { return DateTime.create(raw); } catch (error) { if (error instanceof InvalidDateTimeError) { throw new BadRequestException('Invalid cycle start date'); } throw error; } } }