"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.InviteMemberCommand = void 0; const Result_1 = require("../../../../shared/domain/Result"); const Email_1 = require("../../domain/value-objects/Email"); const Role_1 = require("../../domain/value-objects/Role"); const MemberInvited_1 = require("../../domain/events/MemberInvited"); const crypto_1 = require("crypto"); class InviteMemberCommand { constructor(orgRepository, userRepository, eventBus) { this.orgRepository = orgRepository; this.userRepository = userRepository; this.eventBus = eventBus; } async execute(request) { const org = await this.orgRepository.findById(request.orgId); if (!org) { return (0, Result_1.Err)('Organization not found'); } let email; try { email = Email_1.Email.create(request.email); } catch { return (0, Result_1.Err)('Invalid email address'); } let role; try { role = Role_1.Role.create(request.role); } catch { return (0, Result_1.Err)('Invalid role'); } const user = await this.userRepository.findByEmail(email.value); if (!user) { return (0, Result_1.Err)('User with this email not found. They must register first.'); } const existing = await this.orgRepository.getMember(request.orgId, user.id.toString()); if (existing) { return (0, Result_1.Err)('User is already a member of this organization'); } const memberId = (0, crypto_1.randomUUID)(); await this.orgRepository.addMember({ id: memberId, orgId: request.orgId, userId: user.id.toString(), role: role.value, joinedAt: new Date(), }); const event = new MemberInvited_1.MemberInvited(request.orgId, { email: email.value, role: role.value, inviterUserId: request.inviterUserId, }); await this.eventBus.publish(event); return (0, Result_1.Ok)({ memberId, email: email.value, role: role.value, }); } } exports.InviteMemberCommand = InviteMemberCommand;