$raw Unslashed input. * @param bool $creating True when a new record is being created. * @return array{data: array, errors: array} */ public static function clean( array $raw, bool $creating ): array { $data = array(); $errors = array(); foreach ( array( 'customer_id', 'product_id', 'order_id', 'order_item_id' ) as $field ) { if ( $creating || array_key_exists( $field, $raw ) ) { $data[ $field ] = Sanitizer::absint( $raw[ $field ] ?? 0 ); } } if ( $creating && $data['customer_id'] < 1 ) { $errors['customer_id'] = __( 'Choose a customer.', 'hostkhata' ); } if ( $creating || array_key_exists( 'status', $raw ) ) { $status = Sanitizer::pick( $raw, 'status', ServiceStatus::all(), $creating ? ServiceStatus::ACTIVE : null ); if ( null === $status ) { $errors['status'] = __( 'Choose a valid status.', 'hostkhata' ); } else { $data['status'] = $status; } } if ( $creating || array_key_exists( 'billing_cycle', $raw ) ) { $cycle = Sanitizer::pick( $raw, 'billing_cycle', BillingCycle::all(), $creating ? BillingCycle::MONTHLY : null ); if ( null === $cycle ) { $errors['billing_cycle'] = __( 'Choose a valid billing cycle.', 'hostkhata' ); } else { $data['billing_cycle'] = $cycle; } } if ( $creating || array_key_exists( 'domain', $raw ) ) { $sent = self::sent( $raw, 'domain' ); $data['domain'] = Sanitizer::domain_name( $raw['domain'] ?? '' ); if ( $sent && '' === $data['domain'] ) { $errors['domain'] = __( 'Enter a valid domain name.', 'hostkhata' ); } } if ( $creating || array_key_exists( 'username', $raw ) ) { $username = Sanitizer::text( $raw['username'] ?? '' ); $data['username'] = $username; if ( '' !== $username && 1 !== preg_match( '/^[A-Za-z0-9._@-]{1,100}$/', $username ) ) { $errors['username'] = __( 'Use letters, numbers and . _ @ - only, up to 100 characters.', 'hostkhata' ); } } if ( $creating || array_key_exists( 'server_label', $raw ) ) { $data['server_label'] = Sanitizer::text( $raw['server_label'] ?? '' ); if ( mb_strlen( $data['server_label'] ) > 100 ) { $errors['server_label'] = __( 'Use at most 100 characters.', 'hostkhata' ); } } if ( $creating || array_key_exists( 'server_ip', $raw ) ) { $ip = Sanitizer::text( $raw['server_ip'] ?? '' ); $data['server_ip'] = $ip; if ( '' !== $ip && false === filter_var( $ip, FILTER_VALIDATE_IP ) ) { $errors['server_ip'] = __( 'Enter a valid IP address.', 'hostkhata' ); } } if ( $creating || array_key_exists( 'panel_url', $raw ) ) { $sent = self::sent( $raw, 'panel_url' ); $data['panel_url'] = Sanitizer::url( $raw['panel_url'] ?? '' ); if ( $sent && ( '' === $data['panel_url'] || mb_strlen( $data['panel_url'] ) > 255 ) ) { $errors['panel_url'] = __( 'Enter a valid web address starting with http:// or https://.', 'hostkhata' ); } } if ( $creating || array_key_exists( 'recurring_amount', $raw ) ) { $amount = $raw['recurring_amount'] ?? 0; $amount = '' === $amount ? 0 : $amount; if ( is_int( $amount ) || ( is_string( $amount ) && 1 === preg_match( '/^\d{1,13}$/', trim( $amount ) ) ) ) { $data['recurring_amount'] = min( (int) $amount, self::MAX_AMOUNT ); } else { $errors['recurring_amount'] = __( 'Enter the amount as zero or more.', 'hostkhata' ); } } foreach ( array( 'start_date', 'next_due_date', 'end_date' ) as $field ) { if ( $creating || array_key_exists( $field, $raw ) ) { $sent = self::sent( $raw, $field ); $data[ $field ] = Sanitizer::date( $raw[ $field ] ?? '' ); if ( $sent && '' === $data[ $field ] ) { $errors[ $field ] = __( 'Enter a valid date.', 'hostkhata' ); } } } if ( $creating || array_key_exists( 'notes', $raw ) ) { $data['notes'] = Sanitizer::textarea( $raw['notes'] ?? '' ); if ( mb_strlen( $data['notes'] ) > 5000 ) { $errors['notes'] = __( 'Use at most 5000 characters.', 'hostkhata' ); } } return array( 'data' => $data, 'errors' => $errors, ); } /** * Tells whether a non-empty value was sent for a field. * * @param array $raw Input. * @param string $field Field name. * @return bool */ private static function sent( array $raw, string $field ): bool { return isset( $raw[ $field ] ) && is_scalar( $raw[ $field ] ) && '' !== trim( (string) $raw[ $field ] ); } }