$data Agent data. * @return Agent * @throws DomainException When validation fails, or when every named staff field is occupied. */ public function create( array $data ): Agent { $now = $this->clock->now(); $agent = new Agent( null, Uuid::generate(), isset( $data['wp_user_id'] ) ? (int) $data['wp_user_id'] : null, trim( (string) ( $data['display_name'] ?? '' ) ), new EmailAddress( trim( (string) ( $data['email'] ?? '' ) ) ), isset( $data['phone'] ) && '' !== trim( (string) $data['phone'] ) ? new PhoneNumber( trim( (string) $data['phone'] ) ) : null, isset( $data['bio'] ) ? trim( (string) $data['bio'] ) : null, isset( $data['avatar_id'] ) ? (int) $data['avatar_id'] : null, new TimeZoneId( trim( (string) ( $data['timezone'] ?? 'Europe/London' ) ) ), isset( $data['status'] ) ? AgentStatus::from( (string) $data['status'] ) : AgentStatus::Active, isset( $data['colour'] ) && 1 === preg_match( '/^#[0-9A-Fa-f]{6}$/', (string) $data['colour'] ) ? (string) $data['colour'] : null, (int) ( $data['sort_order'] ?? 0 ), null, $now, $now, ); $this->agents->save( $agent ); return $agent; } /** * Update an existing agent. * * @param int $id Agent id. * @param array $data Agent data. * @return Agent * @throws DomainException When the agent is missing. */ public function update( int $id, array $data ): Agent { $agent = $this->agents->find_by_id( $id ); if ( null === $agent ) { throw new DomainException( 'agent.not_found', 'Agent not found.' ); } $now = $this->clock->now(); $updated = new Agent( $agent->id(), $agent->uuid(), array_key_exists( 'wp_user_id', $data ) ? ( null !== $data['wp_user_id'] ? (int) $data['wp_user_id'] : null ) : $agent->wp_user_id(), array_key_exists( 'display_name', $data ) ? trim( (string) $data['display_name'] ) : $agent->display_name(), array_key_exists( 'email', $data ) ? new EmailAddress( trim( (string) $data['email'] ) ) : $agent->email(), array_key_exists( 'phone', $data ) ? ( null !== $data['phone'] && '' !== trim( (string) $data['phone'] ) ? new PhoneNumber( trim( (string) $data['phone'] ) ) : null ) : $agent->phone(), array_key_exists( 'bio', $data ) ? trim( (string) $data['bio'] ) : $agent->bio(), array_key_exists( 'avatar_id', $data ) ? ( null !== $data['avatar_id'] ? (int) $data['avatar_id'] : null ) : $agent->avatar_id(), array_key_exists( 'timezone', $data ) ? new TimeZoneId( trim( (string) $data['timezone'] ) ) : $agent->timezone(), array_key_exists( 'status', $data ) ? AgentStatus::from( (string) $data['status'] ) : $agent->status(), array_key_exists( 'colour', $data ) ? ( null !== $data['colour'] && 1 === preg_match( '/^#[0-9A-Fa-f]{6}$/', (string) $data['colour'] ) ? (string) $data['colour'] : null ) : $agent->colour(), array_key_exists( 'sort_order', $data ) ? (int) $data['sort_order'] : $agent->sort_order(), $agent->meta(), $agent->created_at(), $now, ); $this->agents->save( $updated ); return $updated; } /** * Delete an agent (soft delete). * * @param int $id Agent id. * * @throws DomainException When the agent is missing. */ public function delete( int $id ): void { $agent = $this->agents->find_by_id( $id ); if ( null === $agent ) { throw new DomainException( 'agent.not_found', 'Agent not found.' ); } $this->agents->soft_delete( $agent, $this->clock->now() ); } }