import { Injectable } from '@nestjs/common';
import { randomUUID } from 'node:crypto';
import { DatabaseService } from '../../../infrastructure/database/database.service';
import { assertGuestCreateInput, assertGuestDietaryInput } from './guest-input-validation';
@Injectable()
export class GuestsService {
constructor(private readonly database: DatabaseService) {}
async create(input: {
organizationId: string;
firstName?: string;
lastName?: string;
displayName?: string;
email?: string;
phone?: string;
preferredLocale?: string;
notes?: string;
}) {
assertGuestCreateInput(input);
const id = randomUUID();
const rows = await this.database.query(
`insert into guests(
id, organization_id, first_name, last_name, display_name,
email_normalized, phone_normalized, preferred_locale, notes
) values ($1,$2,$3,$4,$5,$6,$7,$8,$9)
returning *`,
[
id,
input.organizationId,
input.firstName ?? null,
input.lastName ?? null,
input.displayName ?? null,
input.email?.trim().toLowerCase() ?? null,
input.phone?.trim() ?? null,
input.preferredLocale ?? null,
input.notes ?? null,
],
);
return rows[0];
}
async addDietaryNote(input: {
organizationId: string;
guestId: string;
note: string;
userId?: string;
}) {
assertGuestDietaryInput(input);
const guest = await this.database.query<{ id: string }>(
`select id from guests where id=$1 and organization_id=$2`,
[input.guestId, input.organizationId],
);
if (!guest[0]) throw new Error('guest.not_found');
const id = randomUUID();
await this.database.query(
`insert into guest_dietary_notes(
id, guest_id, note, source, created_by
) values ($1,$2,$3,'staff_recorded',$4)`,
[id, input.guestId, input.note, input.userId ?? null],
);
return { id };
}
}
